網路程式設計——udp客戶端
阿新 • • 發佈:2019-01-06
#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <netinet/in.h> // 子執行緒負責寫資料 void *write_data(void *v) { int conm_socket = *(int*)v; char buf[1024]; while (1) { struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); ssize_t ret = recvfrom(conm_socket, buf, 1023, 0, (struct sockaddr *)&client_addr, &len);// 收 if (-1 == ret) { perror ("read error"); } if (0 == ret) { printf ("客戶端退出\n"); break; } buf[ret] = '\0'; printf ("%s\n", buf); } } // 主執行緒負責讀資料 void read_data(int conm_socket, char **argv) { // 接收方的地址 struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; /* Internet地址族 */ addr.sin_port = htons(atoi(argv[2])); /*伺服器用的埠號 */ addr.sin_addr.s_addr = inet_addr(argv[1]); /*伺服器用的IP地址 */ char buf[1024]; while (1) { fgets(buf, 1024, stdin); sendto(conm_socket, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr)); } } int main(int argc, char **argv) { // 1、建立套接字 int conn_socket = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == conn_socket) { perror("建立套接字失敗"); return -1; } pthread_t thread; pthread_create(&thread, NULL, write_data, (void *)&conn_socket); read_data(conn_socket, argv); close(conn_socket); return 0; }