- UDP服务器
#include <stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<netinet/in.h> #include<stdlib.h> void service(int sock){ char buf[128]; struct sockaddr_in client; socklen_t len=sizeof(client); while(1){ ssize_t s = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len); if(s > 0){ buf[s]=0; printf("[%s:%d]:%s\n",inet_ntoa(client.sin_addr)); } } } int main(int argc,char* argv[]){ if(argc != 3){ printf("Usage:%s [ip] [port]\n",argv[0]); return 3; } int sock=socket(AF_INET,SOCK_DGRAM,0); if(sock < 0){ perror("socket"); return 1; } struct sockaddr_in local; local.sin_family = AF_INET; local.sin_port = htons(atoi(argv[2])); local.sin_addr.s_addr = inet_addr(argv[1]); if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){ perror("bind"); return 2; } service(sock); }
- UDP客户端
#include <stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h> int main(int argc,char* argv[]){ if(argc != 3){ printf("Usage:%s [ip] [port]\n",argv[0]); return 3; } int sock = socket(AF_INET,SOCK_DGRAM,0); if(sock < 0){ perror("socket"); return 2; } struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(atoi(argv[2])); server.sin_addr.s_addr = inet_addr(argv[1]); char buf[128]; struct sockaddr_in peer; socklen_t len = sizeof(peer); while(1){ buf[0] = 0; ssize_t s = read(0,buf,sizeof(buf)-1); if(s > 0){ buf[s-1] = 0; sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,sizeof(server)); ssize_t _s = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer,&len); if(_s > 0){ buf[_s] = 0; printf("server echo# %s\n",buf); } } } }
- 相关函数简介
1.socket函数
功能:用来创建一个能够进行网络通信的套接字。
相关参数:
domain:指定应用程序使用的通信协议的协议族。通常为PF_INET/AF_INET,表示互联网协议族(TCP/IP协议族)。
type:指定要创建的套接字类型。流套接字类型为SOCK_STREAM;数据报套接字类型为SOCK_DGEAM。
Protocol:指定应用程序所使用的通信协议,通常为0。
返回值:成功返回新创建的套接字的描述符;失败返回-1。
2. bind函数
功能:当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。
相关参数:
sockfd:指定待绑定的socket描述符。
addr:指定一个sockaddr结构,结构定义我们在网络编程套接字(2)这篇博客中已经介绍过,这里不再赘述。
addrlen:结构体的大小。
返回值:成功返回0,;失败返回-1。
3.recvfrom函数
功能:接收一个数据报并保存源地址。
相关参数:
sockfd:表示一个已连接套接口的描述字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式,通常为0。
src_addr:指向装有源地址的缓冲区。
addrlen:指向缓冲区的长度值。
返回值:成功返回读入的字节数;失败返回-1。
4.sendto函数
功能:将数据由指定的socket传给对方主机。
相关参数:
sockfd:索引将要从其发送数据的套接字。
buf:指向将要发送数据的缓冲区。
len:将要发送数据的缓冲区长度。
flags:调用操作方式,通常为0。
dest_addr:指向存放接收端地址的区域。
addrlen:指向存放接收端地址的区域的长度值。
返回值:成功返回实际传送出去的字符数;失败返回-1。