
UDP的程衅可以分成客户端和服嗡两钢。两者的诸壁对地址的隘数c socket udp,客户端可以不用进行地质和端口的埃(客户端是随机拿一岗1024的端口去连接的)
和TCP相比c socket udp,UDP缺少connect(),listen(),accept()函数 【襝p面嫌,而UDP是无连接的。】
服文UDP编程:
动議>函数
创建
socket()
?td>bind()
发送
sendto()
接收
recvfrom()
关闭

close()
客户端和服梧比没有癷nd()的步骤。
服文recvfrom是阻塞的,直到接收至数据。
关键词:数据包套接字,套接字文件描剩
socket常见的套接字类型:
- AF_INET(又称 PF_INET)是IPv4网络协议的套接字类型
- AF_INET6 是IPv6网络协议的套接字类型
- AF_UNIX 蕁ix系统本地通信
socket常见的套接字选项:
SOCK_STREAMSOCK_DGRAM
数据羋>数据包
有保障

无保障
面嫌
面犀接
TCP/IP
int s=socket(AF_INET,SOCK_DGRAM,0);
if(s==-1){
perror("create socket: ");
return -1;
}
struct sockaddr serv;
serv.sin_family=AF_INET;
serv.sin_addr.s_addr=htol(INADDR_ANY); // 任意本地IP,网络字节序
serv.sin_port=htos(PORT); //网络字节序
bind(s,(struct sockaddr*)&serv,sizeof(serv)); //白接字和地址
解释“白接字跟地址”,实质上是指猛数据的IP和端口。
它们的联系:
编写一腹用udp通信,client是10.21.1.142, server是10.21.1.229,port是3000. client发送end能并且程续。
客户端:
#include#include #include #include #include #include #define PORT 3000 int main(){ int s=socket(AF_INET,SOCK_DGRAM,0); if(s==-1){ perror("create socket error: "); exit(1); } struct sockaddr_in serv; bzero(&serv,sizeof(serv)); serv.sin_family=AF_INET; serv.sin_addr.s_addr = inet_addr("10.21.1.229"); //htol(INADDR_ANY); serv.sin_port=htons(PORT); char buff[105]; int ret; while(1){ ret=read(STDIN_FILENO,buff,105); if(ret==-1){ perror("read error: "); break; } buff[ret]=0; sendto(s,buff,strlen(buff),0,(struct sockaddr *)&serv,sizeof(serv)); if(strcmp(buff,"end\n")==0){ printf("client process end.\n"); break; } int addr_len=sizeof(serv); if((ret=recvfrom(s,buff,105,0,(struct sockaddr *)&serv,&addr_len))==-1){ perror("recvform error: "); break; } buff[ret]=0; printf("receive message from server: %s",buff); } close(s); return 0; }
服魏
#include#include #include #include #include #include #define PORT 3000 int main(){ int s=socket(AF_INET,SOCK_DGRAM,0); if(s==-1){ perror("create socket error: "); exit(1); } struct sockaddr_in serv,client; bzero(&serv,sizeof(serv)); serv.sin_family=AF_INET; serv.sin_addr.s_addr=inet_addr("10.21.1.229");//htol(INADDR_ANY); serv.sin_port=htons(PORT); //网络字节序 if(bind(s,(struct sockaddr*)&serv,sizeof(serv))==-1){//白接字和地址 perror("bind error: "); exit(1); } while(1){ char buff[105]; int addr_len=sizeof(client); int ret=recvfrom(s,buff,105,0,(struct sockaddr *)&client,&addr_len); // once success, we get client. if(ret==-1){ perror("recvfrom error: "); break; } buff[ret]=0; if(strcmp(buff,"end\n")==0){ printf("server process end.\n"); break; } printf("receive message from client: %s",buff); ret=read(STDIN_FILENO,buff,sizeof(buff)); if(ret<0){ perror("read error: "); break; } if(sendto(s,buff,ret,0,(struct sockaddr *)&client,addr_len)==-1){ perror("sendto error: "); break; } } close(s); return 0; }

会话:
$ ./udp1 hello, I'm client receive message from server: I'm server, I got message. oh, congratulation. receive message from server: hahaha end client process end. $ ./udp1 receive message from client: hello, I'm client I'm server, I got message. receive message from client: oh, congratulation. hahaha server process end.
通用的套接字地址
struct sockaddr
{
unsigned short int sa_family;
char sa_data[14];
};
用户跟内核进行数据交互:
得到数据: recv(), accept()
传入数据: send(), bind()
表示地址长度的参数在得到数据的变量中是传地址的, 而在传入数据的变量垣值的. (对比accept和bind就明白这是正确的.)
tcp server and client work as:
编写tcp socket通信例子, 分为客户端和服慰分,当客户端发送”end”时,结束程衦 />tcp_server.c:
#include#include #include #include #include #include #include const int port = 3000; const int MAX = 10; /* biggest number of connected clients */ const char IP[] = "192.168.123.4"; int main(){ int server_fd=socket(AF_INET,SOCK_STREAM,0); if(server_fd == -1){ perror("socket: "); return -1; } struct sockaddr_in server; bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_addr.s_addr=htonl(INADDR_ANY); //inet_addr(IP); /* both ways are ok. */ server.sin_port=htons(port); if(bind(server_fd,(struct sockaddr *)&server,sizeof(server))==-1){ perror("bind: "); return -1; } if(listen(server_fd,MAX) == -1){ perror("listen: "); return -1; } struct sockaddr_in client; int client_len=sizeof(client); int conn = accept(server_fd, (struct sockaddr *)&client, &client_len); if(conn == -1){ perror("accept: "); return -1; } char buff[105]; while(1){ memset(buff,0,sizeof(buff)); if(read(conn,buff,sizeof(buff)) == -1){ perror("read: "); break; } if(strcmp(buff,"end\n") == 0){ puts("the server process end. "); break; } printf("recv message from client: %s", buff); memset(buff,0,sizeof(buff)); if(read(STDIN_FILENO,buff,sizeof(buff)) == -1){ perror("read: "); break; } if(write(conn,buff,strlen(buff)) == -1){ perror("send: "); break; } } close(conn); close(server_fd); return 0; }
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-135250-1.html
天王老子保护地也能炸个片甲不留
索赔金额高
看上去听上去是有道理