Socket API 处理函数

接口处理篇 X5yLinux联盟
accept, X5yLinux联盟
bind, X5yLinux联盟
connect, X5yLinux联盟
endprotoent, X5yLinux联盟
endservent, X5yLinux联盟
getsockopt, X5yLinux联盟
htonl, X5yLinux联盟
htons, X5yLinux联盟
inet_addr, X5yLinux联盟
inet_aton, X5yLinux联盟
inet_ntoa, X5yLinux联盟
listen, X5yLinux联盟
ntohl, X5yLinux联盟
ntohs, X5yLinux联盟
recv, X5yLinux联盟
recvfrom, X5yLinux联盟
recvmsg, X5yLinux联盟
send, X5yLinux联盟
sendmsg, X5yLinux联盟
sendto, X5yLinux联盟
setprotoent, X5yLinux联盟
setservent, X5yLinux联盟
setsockopt, X5yLinux联盟
shutdown, X5yLinux联盟
socket, X5yLinux联盟
accept(接受socket连线)
相关函数
socket,bind,listen,connectX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int accept(int s,struct sockaddr * addr,int * addrlen);X5yLinux联盟
函数说明
accept ()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构 sockaddr的定义请参考bind()。X5yLinux联盟
返回值
成功则返回新的socket处理代码,失败返回-1,错误原因存于errno中。X5yLinux联盟
错误代码
EBADF 参数s 非合法socket处理代码。X5yLinux联盟
EFAULT 参数addr指针指向无法存取的内存空间。X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟
EOPNOTSUPP 指定的socket并非SOCK_STREAM。X5yLinux联盟
EPERM 防火墙拒绝此连线。X5yLinux联盟
ENOBUFS 系统的缓冲内存不足。X5yLinux联盟
ENOMEM 核心内存不足。X5yLinux联盟
范例
参考listen()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
bind(对socket定位)
相关函数
socket,accept,connect,listenX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int bind(int sockfd,struct sockaddr * my_addr,int addrlen);X5yLinux联盟
函数说明
bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构X5yLinux联盟
struct sockaddrX5yLinux联盟
{X5yLinux联盟
unsigned short int sa_family;X5yLinux联盟
char sa_data[14];X5yLinux联盟
};X5yLinux联盟
sa_family 为调用socket()时的domain参数,即AF_xxxx值。X5yLinux联盟
sa_data 最多使用14个字符长度。X5yLinux联盟
此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET domain,其socketaddr结构定义便为X5yLinux联盟
struct socketaddr_inX5yLinux联盟
{X5yLinux联盟
unsigned short int sin_family;X5yLinux联盟
uint16_t sin_port;X5yLinux联盟
struct in_addr sin_addr;X5yLinux联盟
unsigned char sin_zero[8];X5yLinux联盟
};X5yLinux联盟
struct in_addrX5yLinux联盟
{X5yLinux联盟
uint32_t s_addr;X5yLinux联盟
};X5yLinux联盟
sin_family 即为sa_familyX5yLinux联盟
sin_port 为使用的port编号X5yLinux联盟
sin_addr.s_addr 为IP 地址X5yLinux联盟
sin_zero 未使用。X5yLinux联盟
参数
addrlen为sockaddr的结构长度。X5yLinux联盟
返回值
成功则返回0,失败返回-1,错误原因存于errno中。X5yLinux联盟
错误代码
EBADF 参数sockfd 非合法socket处理代码。X5yLinux联盟
EACCESS 权限不足X5yLinux联盟
ENOTSOCK 参数sockfd为一文件描述词,非socket。X5yLinux联盟
范例
参考listen()X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
connect(建立socket连线)
相关函数
socket,bind,listenX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);X5yLinux联盟
函数说明
connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。X5yLinux联盟
返回值
成功则返回0,失败返回-1,错误原因存于errno中。X5yLinux联盟
错误代码
EBADF 参数sockfd 非合法socket处理代码X5yLinux联盟
EFAULT 参数serv_addr指针指向无法存取的内存空间X5yLinux联盟
ENOTSOCK 参数sockfd为一文件描述词,非socket。X5yLinux联盟
EISCONN 参数sockfd的socket已是连线状态X5yLinux联盟
ECONNREFUSED 连线要求被server端拒绝。X5yLinux联盟
ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。X5yLinux联盟
ENETUNREACH 无法传送数据包至指定的主机。X5yLinux联盟
EAFNOSUPPORT sockaddr结构的sa_family不正确。X5yLinux联盟
EALREADY socket为不可阻断且先前的连线操作还未完成。X5yLinux联盟
范例
X5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#define PORT 1234X5yLinux联盟
#define SERVER_IP “127.0.0.1”X5yLinux联盟
main()X5yLinux联盟
{X5yLinux联盟
int s;X5yLinux联盟
struct sockaddr_in addr;X5yLinux联盟
char buffer[256];X5yLinux联盟
if((s = socket(AF_INET,SOCK_STREAM,0))<0){X5yLinux联盟
perror(“socket”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
X5yLinux联盟
bzero(&addr,sizeof(addr));X5yLinux联盟
addr.sin_family = AF_INET;X5yLinux联盟
addr.sin_port=htons(PORT);X5yLinux联盟
addr.sin_addr.s_addr = inet_addr(SERVER_IP);X5yLinux联盟
X5yLinux联盟
if(connect(s,&addr,sizeof(addr))<0){X5yLinux联盟
perror(“connect”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
X5yLinux联盟
recv(s,buffer,sizeof(buffer),0);X5yLinux联盟
printf(“%s\n”,buffer);X5yLinux联盟
while(1){X5yLinux联盟
bzero(buffer,sizeof(buffer));X5yLinux联盟
X5yLinux联盟
read(STDIN_FILENO,buffer,sizeof(buffer));X5yLinux联盟
X5yLinux联盟
if(send(s,buffer,sizeof(buffer),0)<0){X5yLinux联盟
perror(“send”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
执行
$ ./connectX5yLinux联盟
Welcome to server!X5yLinux联盟
hi I am client! X5yLinux联盟
X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
endprotoent(结束网络协议数据的读取)
相关函数
getprotoent,getprotobyname,getprotobynumber,setprotoentX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
void endprotoent(void);X5yLinux联盟
函数说明
endprotoent()用来关闭由getprotoent()打开的文件。X5yLinux联盟
返回值
X5yLinux联盟
范例
参考getprotoent()X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
endservent(结束网络服务数据的读取)
相关函数
getservent,getservbyname,getservbyport,setserventX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
void endservent(void);X5yLinux联盟
函数说明
endservent()用来关闭由getservent()所打开的文件。X5yLinux联盟
返回值
X5yLinux联盟
范例
参考getservent()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
getsockopt(取得socket状态)
相关函数
setsockoptX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen);X5yLinux联盟
函数说明
getsockopt()会将参数s所指定的socket状态返回。参数optname代表欲取得何种选项状态,而参数optval则指向欲保存结果的内存地址,参数optlen则为该空间的大小。参数level、optname请参考setsockopt()。X5yLinux联盟
返回值
成功则返回0,若有错误则返回-1,错误原因存于errnoX5yLinux联盟
错误代码
EBADF 参数s 并非合法的socket处理代码X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socketX5yLinux联盟
ENOPROTOOPT 参数optname指定的选项不正确X5yLinux联盟
EFAULT 参数optval指针指向无法存取的内存空间X5yLinux联盟
范例
#includeX5yLinux联盟
#includeX5yLinux联盟
main()X5yLinux联盟
{X5yLinux联盟
int s,optval,optlen = sizeof(int);X5yLinux联盟
if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”);X5yLinux联盟
getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);X5yLinux联盟
printf(“optval = %d\n”,optval);X5yLinux联盟
close(s);}X5yLinux联盟
执行
optval = 1 X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
htonl(将32位主机字符顺序转换成网络字符顺序)
相关函数
htons,ntohl,ntohsX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
unsigned long int htonl(unsigned long int hostlong);X5yLinux联盟
函数说明
htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。X5yLinux联盟
返回值
返回对应的网络字符顺序。X5yLinux联盟
范例
参考getservbyport()或connect()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
htons(将16位主机字符顺序转换成网络字符顺序)
相关函数
htonl,ntohl,ntohsX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
unsigned short int htons(unsigned short int hostshort);X5yLinux联盟
函数说明
htons()用来将参数指定的16位hostshort转换成网络字符顺序。X5yLinux联盟
返回值
返回对应的网络字符顺序。X5yLinux联盟
范例
参考connect()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
inet_addr(将网络地址转成二进制的数字)
相关函数
inet_aton,inet_ntoaX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
unsigned long int inet_addr(const char *cp);X5yLinux联盟
函数说明
inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。X5yLinux联盟
返回值
成功则返回对应的网络二进制的数字,失败返回-1。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
inet_aton(将网络地址转成网络二进制的数字)
相关函数
inet_addr,inet_ntoaX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int inet_aton(const char * cp,struct in_addr *inp);X5yLinux联盟
函数说明
inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。X5yLinux联盟
结构in_addr定义如下X5yLinux联盟
struct in_addrX5yLinux联盟
{X5yLinux联盟
unsigned long int s_addr;X5yLinux联盟
};X5yLinux联盟
返回值
成功则返回非0值,失败则返回0。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
inet_ntoa(将网络二进制的数字转换成网络地址)
相关函数
inet_addr,inet_atonX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
char * inet_ntoa(struct in_addr in);X5yLinux联盟
函数说明
inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。X5yLinux联盟
返回值
成功则返回字符串指针,失败则返回NULL。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
listen(等待连接)
相关函数
socket,bind,accept,connectX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
int listen(int s,int backlog);X5yLinux联盟
函数说明
listen ()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。 Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。X5yLinux联盟
返回值
成功则返回0,失败返回-1,错误原因存于errnoX5yLinux联盟
附加说明
listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。X5yLinux联盟
错误代码
EBADF 参数sockfd非合法socket处理代码X5yLinux联盟
EACCESS 权限不足X5yLinux联盟
EOPNOTSUPP 指定的socket并未支援listen模式。X5yLinux联盟
范例
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#define PORT 1234X5yLinux联盟
#define MAXSOCKFD 10X5yLinux联盟
main()X5yLinux联盟
{X5yLinux联盟
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;X5yLinux联盟
struct sockaddr_in addr;X5yLinux联盟
int addr_len = sizeof(struct sockaddr_in);X5yLinux联盟
fd_set readfds;X5yLinux联盟
char buffer[256];X5yLinux联盟
char msg[ ] =”Welcome to server!”;X5yLinux联盟
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){X5yLinux联盟
perror(“socket”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
bzero(&addr,sizeof(addr));X5yLinux联盟
addr.sin_family =AF_INET;X5yLinux联盟
addr.sin_port = htons(PORT);X5yLinux联盟
addr.sin_addr.s_addr = htonl(INADDR_ANY);X5yLinux联盟
if(bind(sockfd,&addr,sizeof(addr))<0){X5yLinux联盟
perror(“connect”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
if(listen(sockfd,3)<0){X5yLinux联盟
perror(“listen”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
for(fd=0;fdX5yLinux联盟
is_connected[fd]=0;X5yLinux联盟
while(1){X5yLinux联盟
FD_ZERO(&readfds);X5yLinux联盟
FD_SET(sockfd,&readfds);X5yLinux联盟
for(fd=0;fdX5yLinux联盟
if(is_connected[fd]) FD_SET(fd,&readfds);X5yLinux联盟
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;X5yLinux联盟
for(fd=0;fdX5yLinux联盟
if(FD_ISSET(fd,&readfds)){X5yLinux联盟
if(sockfd = =fd){X5yLinux联盟
if((newsockfd = accept (sockfd,&addr,&addr_len))<0)X5yLinux联盟
perror(“accept”);X5yLinux联盟
write(newsockfd,msg,sizeof(msg));X5yLinux联盟
is_connected[newsockfd] =1;X5yLinux联盟
printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr));X5yLinux联盟
}else{X5yLinux联盟
bzero(buffer,sizeof(buffer));X5yLinux联盟
if(read(fd,buffer,sizeof(buffer))<=0){X5yLinux联盟
printf(“connect closed.\n”);X5yLinux联盟
is_connected[fd]=0;X5yLinux联盟
close(fd);X5yLinux联盟
}elseX5yLinux联盟
printf(“%s”,buffer);X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
执行
$ ./listenX5yLinux联盟
connect from 127.0.0.1X5yLinux联盟
hi I am clientX5yLinux联盟
connected closed.X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
ntohl(将32位网络字符顺序转换成主机字符顺序)
相关函数
htonl,htons,ntohsX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
unsigned long int ntohl(unsigned long int netlong);X5yLinux联盟
函数说明
ntohl()用来将参数指定的32位netlong转换成主机字符顺序。X5yLinux联盟
返回值
返回对应的主机字符顺序。X5yLinux联盟
范例
参考getservent()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
ntohs(将16位网络字符顺序转换成主机字符顺序)
相关函数
htonl,htons,ntohlX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
unsigned short int ntohs(unsigned short int netshort);X5yLinux联盟
函数说明
ntohs()用来将参数指定的16位netshort转换成主机字符顺序。X5yLinux联盟
返回值
返回对应的主机顺序。X5yLinux联盟
范例
参考getservent()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
recv(经socket接收数据)
相关函数
recvfrom,recvmsg,send,sendto,socketX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int recv(int s,void *buf,int len,unsigned int flags);X5yLinux联盟
函数说明
recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。X5yLinux联盟
参数
flags一般设0。其他数值定义如下:X5yLinux联盟
MSG_OOB 接收以out-of-band 送出的数据。X5yLinux联盟
MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用recv()会返回相同的数据内容。X5yLinux联盟
MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。X5yLinux联盟
MSG_NOSIGNAL此操作不愿被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误原因存于errno中。X5yLinux联盟
错误代码
EBADF 参数s非合法的socket处理代码X5yLinux联盟
EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟
EINTR 被信号所中断X5yLinux联盟
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断X5yLinux联盟
ENOBUFS 系统的缓冲内存不足。X5yLinux联盟
ENOMEM 核心内存不足X5yLinux联盟
EINVAL 传给系统调用的参数不正确。X5yLinux联盟
范例
参考listen()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
recvfrom(经socket接收数据)
相关函数
recv,recvmsg,send,sendto,socketX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);X5yLinux联盟
函数说明
recv ()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参数flags 一般设0,其他数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为sockaddr的结构长度。X5yLinux联盟
返回值
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。X5yLinux联盟
错误代码
EBADF 参数s非合法的socket处理代码X5yLinux联盟
EFAULT 参数中有一指针指向无法存取的内存空间。X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟
EINTR 被信号所中断。X5yLinux联盟
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟
ENOBUFS 系统的缓冲内存不足X5yLinux联盟
ENOMEM 核心内存不足X5yLinux联盟
EINVAL 传给系统调用的参数不正确。X5yLinux联盟
范例
X5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#includeX5yLinux联盟
#define PORT 2345X5yLinux联盟
#define SERVER_IP “127.0.0.1”X5yLinux联盟
main()X5yLinux联盟
{X5yLinux联盟
int s,len;X5yLinux联盟
struct sockaddr_in addr;X5yLinux联盟
int addr_len =sizeof(struct sockaddr_in);X5yLinux联盟
char buffer[256];X5yLinux联盟
X5yLinux联盟
if((s = socket(AF_INET,SOCK_DGRAM,0))<0){X5yLinux联盟
perror(“socket”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
X5yLinux联盟
bzero(&addr,sizeof(addr));X5yLinux联盟
addr.sin_family = AF_INET;X5yLinux联盟
addr.sin_port = htons(PORT);X5yLinux联盟
addr.sin_addr.s_addr = inet_addr(SERVER_IP);X5yLinux联盟
while(1){X5yLinux联盟
bzero(buffer,sizeof(buffer));X5yLinux联盟
X5yLinux联盟
len =read(STDIN_FILENO,buffer,sizeof(buffer));X5yLinux联盟
X5yLinux联盟
sendto(s,buffer,len,0,&addr,addr_len);X5yLinux联盟
X5yLinux联盟
len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);X5yLinux联盟
printf(“receive: %s”,buffer);X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
执行
(先执行udp server 再执行udp client)X5yLinux联盟
hello X5yLinux联盟
receive: hello X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
recvmsg(经socket接收数据)
相关函数
recv,recvfrom,send,sendto,sendmsg,socketX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int recvmsg(int s,struct msghdr *msg,unsigned int flags);X5yLinux联盟
函数说明
recvmsg ()用来接收远程主机经指定的socket传来的数据。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据结构内容,参数flags一般设0,详细描述请参考send()。关于结构msghdr的定义请参考sendmsg()。X5yLinux联盟
返回值
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。X5yLinux联盟
错误代码
EBADF 参数s非合法的socket处理代码。X5yLinux联盟
EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟
EINTR 被信号所中断。X5yLinux联盟
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟
ENOBUFS 系统的缓冲内存不足X5yLinux联盟
ENOMEM 核心内存不足X5yLinux联盟
EINVAL 传给系统调用的参数不正确。X5yLinux联盟
范例
参考recvfrom()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
send(经socket传送数据)
相关函数
sendto,sendmsg,recv,recvfrom,socketX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int send(int s,const void * msg,int len,unsigned int falgs);X5yLinux联盟
函数说明
send()用来将数据由指定的socket 传给对方主机。参数s为已建立好连接的socket。参数msg指向欲连线的数据内容,参数len则为数据长度。参数flags一般设0,其他数值定义如下X5yLinux联盟
MSG_OOB 传送的数据以out-of-band 送出。X5yLinux联盟
MSG_DONTROUTE 取消路由表查询X5yLinux联盟
MSG_DONTWAIT 设置为不可阻断运作X5yLinux联盟
MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断。X5yLinux联盟
返回值
成功则返回实际传送出去的字符数,失败返回-1。错误原因存于errnoX5yLinux联盟
错误代码
EBADF 参数s 非合法的socket处理代码。X5yLinux联盟
EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟
EINTR 被信号所中断。X5yLinux联盟
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟
ENOBUFS 系统的缓冲内存不足X5yLinux联盟
ENOMEM 核心内存不足X5yLinux联盟
EINVAL 传给系统调用的参数不正确。X5yLinux联盟
范例
参考connect()X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
sendmsg(经socket传送数据)
相关函数
send,sendto,recv,recvfrom,recvmsg,socketX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);X5yLinux联盟
函数说明
sendmsg()用来将数据由指定的socket传给对方主机。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg 指向欲连线的数据结构内容,参数flags一般默认为0,详细描述请参考send()。X5yLinux联盟
结构msghdr定义如下X5yLinux联盟
struct msghdrX5yLinux联盟
{X5yLinux联盟
void *msg_name; X5yLinux联盟
socklen_t msg_namelen; X5yLinux联盟
strcut iovec * msg_iov; X5yLinux联盟
size_t msg_iovlen; X5yLinux联盟
void * msg_control; X5yLinux联盟
size_t msg_controllen; X5yLinux联盟
int msg_flags; X5yLinux联盟
};X5yLinux联盟
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errnoX5yLinux联盟
错误代码
EBADF 参数s 非合法的socket处理代码。X5yLinux联盟
EFAULT 参数中有一指针指向无法存取的内存空间X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socket。X5yLinux联盟
EINTR 被信号所中断。X5yLinux联盟
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。X5yLinux联盟
ENOBUFS 系统的缓冲内存不足X5yLinux联盟
ENOMEM 核心内存不足X5yLinux联盟
EINVAL 传给系统调用的参数不正确。X5yLinux联盟
范例
参考sendto()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
sendto(经socket传送数据)
相关函数
send , sendmsg,recv , recvfrom , socketX5yLinux联盟
表头文件
#include < sys/types.h >X5yLinux联盟
#include < sys/socket.h >X5yLinux联盟
定义函数
int sendto ( int s , const void * msg, int len, unsigned int flags, const X5yLinux联盟
struct sockaddr * to , int tolen ) ;X5yLinux联盟
函数说明
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr 的结果长度。X5yLinux联盟
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。X5yLinux联盟
错误代码
EBADF 参数s非法的socket处理代码。X5yLinux联盟
EFAULT 参数中有一指针指向无法存取的内存空间。X5yLinux联盟
WNOTSOCK canshu s为一文件描述词,非socket。X5yLinux联盟
EINTR 被信号所中断。X5yLinux联盟
EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。X5yLinux联盟
ENOBUFS 系统的缓冲内存不足。X5yLinux联盟
EINVAL 传给系统调用的参数不正确。X5yLinux联盟
范例
#include < sys/types.h >X5yLinux联盟
#include < sys/socket.h >X5yLinux联盟
# include X5yLinux联盟
#include X5yLinux联盟
#define PORT 2345 X5yLinux联盟
main(){X5yLinux联盟
int sockfd,len;X5yLinux联盟
struct sockaddr_in addr;X5yLinux联盟
char buffer[256];X5yLinux联盟
X5yLinux联盟
if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){X5yLinux联盟
perror (“socket”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
X5yLinux联盟
bzero ( &addr, sizeof(addr) );X5yLinux联盟
addr.sin_family=AF_INET;X5yLinux联盟
addr.sin_port=htons(PORT);X5yLinux联盟
addr.sin_addr=hton1(INADDR_ANY) ;X5yLinux联盟
if (bind(sockfd, &addr, sizeof(addr))<0){X5yLinux联盟
perror(“connect”);X5yLinux联盟
exit(1);X5yLinux联盟
}X5yLinux联盟
while(1){X5yLinux联盟
bezro(buffer,sizeof(buffer));X5yLinux联盟
len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);X5yLinux联盟
X5yLinux联盟
printf(“receive from %s\n “ , inet_ntoa( addr.sin_addr));X5yLinux联盟
X5yLinux联盟
sendto(sockfd,buffer,len,0,&addr,addr_len);”X5yLinux联盟
}X5yLinux联盟
}X5yLinux联盟
执行
请参考recvfrom()X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
setprotoent(打开网络协议的数据文件)
相关函数
getprotobyname, getprotobynumber, endprotoentX5yLinux联盟
表头文件
#include X5yLinux联盟
定义函数
void setprotoent (int stayopen);X5yLinux联盟
函数说明
setprotoent()用来打开/etc/protocols, 如果参数stayopen值为1,则接下来的getprotobyname()或getprotobynumber()将不会自动关闭此文件。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
setservent(打开主机网络服务的数据文件)
相关函数
getservent, getservbyname, getservbyport, endserventX5yLinux联盟
表头文件
#include < netdb.h >X5yLinux联盟
定义函数
void setservent (int stayopen);X5yLinux联盟
函数说明
setservent()用来打开/etc/services,如果参数stayopen值为1,则接下来的getservbyname()或getservbyport()将补回自动关闭文件。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
setsockopt(设置socket状态)
相关函数
getsockoptX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen);X5yLinux联盟
函数说明
setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值:X5yLinux联盟
SO_DEBUG 打开或关闭排错模式X5yLinux联盟
SO_REUSEADDR 允许在bind()过程中本地地址可重复使用X5yLinux联盟
SO_TYPE 返回socket形态。X5yLinux联盟
SO_ERROR 返回socket已发生的错误原因X5yLinux联盟
SO_DONTROUTE 送出的数据包不要利用路由设备来传输。X5yLinux联盟
SO_BROADCAST 使用广播方式传送X5yLinux联盟
SO_SNDBUF 设置送出的暂存区大小X5yLinux联盟
SO_RCVBUF 设置接收的暂存区大小X5yLinux联盟
SO_KEEPALIVE 定期确定连线是否已终止。X5yLinux联盟
SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备X5yLinux联盟
SO_LINGER 确保数据安全且可靠的传送出去。X5yLinux联盟
参数
optval代表欲设置的值,参数optlen则为optval的长度。X5yLinux联盟
返回值
成功则返回0,若有错误则返回-1,错误原因存于errno。X5yLinux联盟
附加说明
EBADF 参数s并非合法的socket处理代码X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socketX5yLinux联盟
ENOPROTOOPT 参数optname指定的选项不正确。X5yLinux联盟
EFAULT 参数optval指针指向无法存取的内存空间。X5yLinux联盟
范例
参考getsockopt()。X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
shutdown(终止socket通信)
相关函数
socket,connectX5yLinux联盟
表头文件
#includeX5yLinux联盟
定义函数
int shutdown(int s,int how);X5yLinux联盟
函数说明
shutdown()用来终止参数s所指定的socket连线。参数s是连线中的socket处理代码,参数how有下列几种情况:X5yLinux联盟
how=0 终止读取操作。X5yLinux联盟
how=1 终止传送操作X5yLinux联盟
how=2 终止读取及传送操作X5yLinux联盟
返回值
成功则返回0,失败返回-1,错误原因存于errno。X5yLinux联盟
错误代码
EBADF 参数s不是有效的socket处理代码X5yLinux联盟
ENOTSOCK 参数s为一文件描述词,非socketX5yLinux联盟
ENOTCONN 参数s指定的socket并未连线X5yLinux联盟
 
X5yLinux联盟
X5yLinux联盟
X5yLinux联盟
socket(建立一个socket通信)
相关函数
accept,bind,connect,listenX5yLinux联盟
表头文件
#includeX5yLinux联盟
#includeX5yLinux联盟
定义函数
int socket(int domain,int type,int protocol);X5yLinux联盟
函数说明
socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。参数domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h 内,底下是常见的协议:X5yLinux联盟
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通信协议X5yLinux联盟
PF_INET?AF_INET Ipv4网络协议X5yLinux联盟
PF_INET6/AF_INET6 Ipv6 网络协议X5yLinux联盟
PF_IPX/AF_IPX IPX-Novell协议X5yLinux联盟
PF_NETLINK/AF_NETLINK 核心用户接口装置X5yLinux联盟
PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议X5yLinux联盟
PF_AX25/AF_AX25 业余无线AX.25协议X5yLinux联盟
PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCsX5yLinux联盟
PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议X5yLinux联盟
PF_PACKET/AF_PACKET 初级封包接口X5yLinux联盟
参数
type有下列几种数值:X5yLinux联盟
SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持X5yLinux联盟
OOB 机制,在所有数据传送前必须使用connect()来建立连线状态。X5yLinux联盟
SOCK_DGRAM 使用不连续不可信赖的数据包连接X5yLinux联盟
SOCK_SEQPACKET 提供连续可信赖的数据包连接X5yLinux联盟
SOCK_RAW 提供原始网络协议存取X5yLinux联盟
SOCK_RDM 提供可信赖的数据包连接X5yLinux联盟
SOCK_PACKET 提供和网络驱动程序直接通信。X5yLinux联盟
protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可。X5yLinux联盟
返回值
成功则返回socket处理代码,失败返回-1。X5yLinux联盟
错误代码
EPROTONOSUPPORT 参数domain指定的类型不支持参数type或protocol指定的协议X5yLinux联盟
ENFILE 核心内存不足,无法建立新的socket结构X5yLinux联盟
EMFILE 进程文件表溢出,无法再建立新的socketX5yLinux联盟
EACCESS 权限不足,无法建立type或protocol指定的协议X5yLinux联盟
ENOBUFS/ENOMEM 内存不足X5yLinux联盟
EINVAL 参数domain/type/protocol不合法X5yLinux联盟
范例
参考connect()。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值