Client-Server C程序示例C (使用 Sockets 和 TCP)
下面你将看到一个非常简单的client-server 的C程序示例。 基本上客户端连接到服务器上,服务器发一个消息 “Hello World”,然后客户端打印接收到的消息。
请注意我是手动配置设置的。如果你想你的代码是IPV4-IPV6 无关, IP 无关且可移植到不同的平台上你可以使用该教程介绍过的getaddrinfo() 函数。
其次,我在大多数的函数调用上没有执行错误检查。如果你想把代码用到一个实际项目上的话你应该实现这些检查。
第三,如果你想到关于函数和其参数的更多细节的话,请看每个函数的man page。
最后一点,为了测试代码你仅仅需要在一个终端上跑对应的服务器,然后在另一个终端上跑客户端(或者将服务器做为一个后台进程执行,然后在相同的终端上执行客户端。
服务端代码
- /****************** SERVER CODE ****************/
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- int main(){
- int welcomeSocket, newSocket;
- char buffer[1024];
- struct sockaddr_in serverAddr;
- struct sockaddr_storage serverStorage;
- socklen_t addr_size;
- /*---- Create the socket. The three arguments are: ----*/
- /* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
- welcomeSocket = socket(PF_INET, SOCK_STREAM, 0);
- /*---- Configure settings of the server address struct ----*/
- /* Address family = Internet */
- serverAddr.sin_family = AF_INET;
- /* Set port number, using htons function to use proper byte order */
- serverAddr.sin_port = htons(7891);
- /* Set IP address to localhost */
- serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
- /* Set all bits of the padding field to 0 */
- memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
- /*---- Bind the address struct to the socket ----*/
- bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
- /*---- Listen on the socket, with 5 max connection requests queued ----*/
- if(listen(welcomeSocket,5)==0)
- printf("Listening\n");
- else
- printf("Error\n");
- /*---- Accept call creates a new socket for the incoming connection ----*/
- addr_size = sizeof serverStorage;
- newSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size);
- /*---- Send message to the socket of the incoming connection ----*/
- strcpy(buffer,"Hello World\n");
- send(newSocket,buffer,13,0);
- return 0;
- }
客户端代码
- /****************** CLIENT CODE ****************/
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- int main(){
- int clientSocket;
- char buffer[1024];
- struct sockaddr_in serverAddr;
- socklen_t addr_size;
- /*---- Create the socket. The three arguments are: ----*/
- /* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
- clientSocket = socket(PF_INET, SOCK_STREAM, 0);
- /*---- Configure settings of the server address struct ----*/
- /* Address family = Internet */
- serverAddr.sin_family = AF_INET;
- /* Set port number, using htons function to use proper byte order */
- serverAddr.sin_port = htons(7891);
- /* Set IP address to localhost */
- serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
- /* Set all bits of the padding field to 0 */
- memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
- /*---- Connect the socket to the server using the address struct ----*/
- addr_size = sizeof serverAddr;
- connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);
- /*---- Read the message from the server into the buffer ----*/
- recv(clientSocket, buffer, 1024, 0);
- /*---- Print the received message ----*/
- printf("Data received: %s",buffer);
- return 0;
- }