#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/wait.h> typedef struct sockaddr SA; int open_clientfd(char* hostname,int port)
{
int clientfd;
struct hostent * hp;
struct sockaddr_in serveraddr;
char* msg; /*创建socket*/
if((clientfd=socket(AF_INET,SOCK_STREAM,))<)
{
msg="client socket() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="client socket() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*填写server的ip地址和port*/
if((hp=gethostbyname(hostname))==NULL)
{
msg="client gethostbyname() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="client gethostbyname() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(port);
bcopy((char*)hp->h_addr_list[],(char*)&serveraddr.sin_addr.s_addr,hp->h_length); /*建立连接*/
if(connect(clientfd,(SA*)&serveraddr,sizeof(serveraddr))<)
{
msg="client connect() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="client connect() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); return clientfd;
} int open_listenfd(int port)
{
int listenfd,optval;
struct sockaddr_in serveraddr;
char* msg; /*创建socket*/
if((listenfd=socket(AF_INET,SOCK_STREAM,))<)
{
msg="server socket() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server socket() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*配置服务器使得它能被立即终止和重启*/
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(const void *)&optval,sizeof(int))<)
{
msg="server setsockopt() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server setsockopt() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*绑定服务端的ip和端口*/
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons((unsigned short)port);
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(SA*)&serveraddr,sizeof(serveraddr))<)
{
msg="server bind() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server bind() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*创建listen*/
if(listen(listenfd,)<)
{
msg="server listen() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server listen() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); return listenfd;
}

open_clientfd(char* hostname,int port)和open_listenfd(int port)的更多相关文章

  1. java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)

    java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...

  2. const int * p 和 int const * p 和 int * const p 的区别

    首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...

  3. C++中int *p[4]和 int (*q)[4]的区别

    这俩兄弟长得实在太像,以至于经常让人混淆.然而细心领会和甄别就会发现它们大有不同. 前者是指针数组,后者是指向数组的指针.更详细地说. 前: 指针数组;是一个元素全为指针的数组.后: 数组指针;可以直 ...

  4. C++中(int&)和(int)的区别

    在说这个问题之前,先说两个需要知道的背景知识: (1)语言的类型的强制转换不会修改原来的数据,会另外的开辟一个临时的或者程序中指定的空间来存储强制转换后的值. (2)C++引用的实现是在符号表中动了手 ...

  5. 将int转int数组并将int数组元素处理后转int,实现加密

    package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...

  6. signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解

    把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...

  7. C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);

    问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,&l ...

  8. 编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试Stud

    package zuoye; public class student { int age; String name; int stuNO; void outPut() { System.out.pr ...

  9. (int &)a 和(int)a

      [cpp] view plain copy float a = 1.0f;     cout < < (int)a < < endl;     cout < < ...

随机推荐

  1. delphi 在 DragDrop 的时候,滚动 TreeView

    在 DragDrop 的时候,滚动 TreeView 当高度不够的时候   procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, ...

  2. apicloud+融云实现即时通讯

    请尊重作者的辛勤劳动!!! 使用apicloud开发已经快2个月了,起初的目的就是为了实现安卓和苹果的兼容,属于一个试验项目,究竟apicloud是否能够满足公司的要求?最 终看来还是不错的,使用ap ...

  3. [AngularJS] Using ngModel in Custom Directives

    You can use ngModel in your own directives, but there are a few things you'll need to do to get it w ...

  4. linux编程基础

    http://blog.csdn.net/jnu_simba/article/details/8806654

  5. Python学习 之 文件

    1.文件读写 python进行文件读写的函数是open或file file_handler=open(filename,,mode) (1)打开并读取文件 方式一:open() fo=open('/r ...

  6. php生成excel或php生成csv

    一.php生成excel 使用phpexcel类文件生成 二.php生成csv <?php$action ="make";if ($action=='make'){ $fp ...

  7. Collections.synchronizedMap 详解

    众所周知,HashMap 本身非线程安全的,但是当使用 Collections.synchronizedMap(new HashMap()) 进行包装后就返回一个线程安全的Map. 怎么实现的呢?今天 ...

  8. 为Mono安装MySql连接驱动

    为Mono安装MySql连接驱动(转) 2013 年 1 月 24 日.NETmono.MySql DOTNET and Mono by default only support database c ...

  9. hibernate 插件安装

    安装hibernate插件 1,help--install new software work with选择All Available Sites 搜索框输入hibernate  会出现所有hiber ...

  10. Android数据库的使用

    学了web好久没继续做,现在做android开发断断续续也近一年了,实习是android,现在毕业了工作也是android,但是对于数据库这块由于最近项目需要就研究了下其常用操作,这篇博客中的观点仅代 ...