Unix/Linux Socket 客戶端代碼實例
我們已經看過前麵的教學,為了編寫TCP客戶端程序需要執行以下步驟:
-
創建一個套接字socket()係統調用。
-
套接字連接的服務器地址使用connect()係統調用。
-
發送和接收數據。做到這一點的方法有許多,但最簡單的方法是使用read() 和write() 係統調用。
現在要把上麵這些步驟的形式寫成源代碼。把這個代碼寫client.c文件並用gcc編譯器編譯。
運行該程序,並通過服務器的主機名和端口號連接到服務器,必須已經運行在另一個UNIX窗口。
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); /* Create a socket point */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); /* Now connect to the server */ if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) { perror("ERROR connecting"); exit(1); } /* Now ask for a message from the user, this message * will be read by server */ printf("Please enter the message: "); bzero(buffer,256); fgets(buffer,255,stdin); /* Send message to the server - by gitbook.net */ n = write(sockfd,buffer,strlen(buffer)); if (n < 0) { perror("ERROR writing to socket"); exit(1); } /* Now read server response */ bzero(buffer,256); n = read(sockfd,buffer,255); if (n < 0) { perror("ERROR reading from socket"); exit(1); } printf("%s\n",buffer); return 0; } |