首先自定义一个头文件,其中包括一些API函数和宏定义。
#ifndef _MYHEAD_H_ #define _MYHEAD_H_ #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MYADDR "192.168.121.128" //此为服务器所在主机的ip地址 #define MYPORT 6666 #endif服务器程序:server.c
#include "myhead.h" int main() { int sockfd = 0; int clifd = 0; int ret = 0; int len = sizeof(struct sockaddr); struct sockaddr_in sock_server = {0}; struct sockaddr_in sock_client = {0}; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (-1 == sockfd) { perror("socket"); return -1; } printf("socket success...\n"); sock_server.sin_family = AF_INET; sock_server.sin_port = htons(MYPORT); sock_server.sin_addr.s_addr = inet_addr(MYADDR); ret = bind(sockfd, (struct sockaddr*)&sock_server, sizeof(struct sockaddr)); if (-1 == ret) { perror("bind"); return -1; } printf("bind success...\n"); ret = listen(sockfd, 10); if (-1 == ret) { perror("listen"); return -1; } printf("listen success...\n"); clifd = accept(sockfd, (struct sockaddr*)&sock_client, &len); if (-1 == clifd) { perror("accept"); return -1; } printf("accept success...client's fd = %d\n", clifd); int recvcnt = 0; char recvbuf[1024] = {0}; char sendbuf[1024] = {0}; while (1) { memset(recvbuf, 0, 1024); recvcnt = recv(clifd, recvbuf, sizeof(recvbuf), 0); if (-1 == recvcnt) { perror("recv"); return -1; } else { printf("serv recv: cli say: %s\n", recvbuf); } if (0 == strncmp(recvbuf, "end", 3)) { close(sockfd); close(clifd); break; } printf("serv say:"); scanf("%s", sendbuf); if (-1 == send(clifd, sendbuf, strlen(sendbuf), 0)) { perror("send"); return -1; } memset(sendbuf, 0, 1024); } return 0; }客户端程序:client.c
#include "myhead.h" int main() { int sockfd = 0; int ret = 0; struct sockaddr_in sock_server = {0}; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (-1 == sockfd) { perror("socket"); return -1; } printf("socket success...\n"); sock_server.sin_family = AF_INET; sock_server.sin_port = htons(MYPORT); sock_server.sin_addr.s_addr = inet_addr(MYADDR); ret = connect(sockfd, (struct sockaddr*)&sock_server, sizeof(struct sockaddr)); if (-1 == ret) { perror("connect"); return -1; } printf("connect success...\n"); int sendcnt = 0; char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; while (1) { printf("cli say:"); scanf("%s", sendbuf); sendcnt = send(sockfd, sendbuf, strlen(sendbuf), 0); if (-1 == sendcnt) { perror("send"); return -1; } if (0 == strncmp(sendbuf, "end", 3)) { close(sockfd); break; } memset(sendbuf, 0, 1024); if (-1 == recv(sockfd, recvbuf, sizeof(recvbuf), 0)) { perror("recv"); return -1; } else { printf("cli recv: serv say: %s\n", recvbuf); } } return 0; }分别编译服务器和客户端程序: gcc server.c -o server gcc client.c -o client 然后,先运行服务器./server,再运行客户端./client,客户端发消息给服务器,服务器回复,实现基本的一收一发的功能。