1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h>
#define ERR_EXIT(x) do{perror(x); exit(EXIT_FAILURE);}while(0)
void echo_cli(int sock) { struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = 6000; servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");//绑定服务器地址 if(connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)//连接后只能给指定的IP发送数据,则sendto可以不需要指定IP和端口了,UDP的connect是进行了一个弱绑定,不会进行三次握手和四次挥手 ERR_EXIT("connect"); int ret = 0; char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; while(1) { memset(sendbuf, 0, sizeof(sendbuf)); memset(recvbuf, 0, sizeof(recvbuf)); if(fgets(sendbuf, sizeof(sendbuf), stdin) == NULL) ERR_EXIT("fgets"); //sendto(sock, sendbuf, strlen(sendbuf), 0, NULL, 0); send(sock, sendbuf, strlen(sendbuf), 0); ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL); if(ret < 0) { if(errno == EINTR) continue; ERR_EXIT("recvbrom"); } fputs(recvbuf, stdout); } }
int main() { int sock = 0; sock = socket(PF_INET, SOCK_DGRAM, 0);//参数一表示为IPV4地址家族,第二个参数IPV4对应的UDP套接口,第三个参数0表示内核自动选择协议根据前两个可以确定通信协议为UDP的 if(sock < 0) { ERR_EXIT("socket"); } echo_cli(sock); return 0; }
|