本文共 3280 字,大约阅读时间需要 10 分钟。
这段代码实现了一个简单的TCP服务器端程序,主要使用了socket()
、bind()
、listen()
和accept()
函数完成监听和连接处理。以下是代码的详细说明:
#include#include #include #include #include #include #include #include
#define SERVPORT 3333#define BACKLOG 10int main(void) { int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("socket 创建失败!"); exit(1); } printf("创建监听socket成功。\n");
socklen_t
结构体myAddr
配置socket地址信息。filled my sin_zero
部分以确保结构体对齐。struct sockaddr_in myAddr;myAddr.sin_family = AF_INET;myAddr.sin_port = htons(SERVPORT);myAddr.sin_addr.s_addr = INADDR_ANY;bzero(&myAddr.sin_zero, 8);
if (bind(sockfd, (struct sockaddr *)&myAddr, sizeof(struct sockaddr)) == -1) { printf("bind 出错!"); exit(1);}printf("socket绑定成功。\n");
BACKLOG
(即最多10个未接受的连接请求),并进入主循环处理客户端连接。printf("服务端开始listen......\n");int lisVal = listen(sockfd, BACKLOG);printf("zhi %d", lisVal);if (lisVal == -1) { printf("listen 出错!"); exit(1);}printf("------listen is ok----\n");while (1) {
accept()
函数等待并接受客户端连接。如果连接成功,会打印客户端地址信息,并进入子进程处理数据传输。struct sockaddr_in remoteAddr;int clientFd;int sin_size = sizeof(struct sockaddr_in);printf("----------");if ((clientFd = accept(sockfd, (struct sockaddr *)&remoteAddr, &sin_size)) == -1) { printf("accept erro!"); continue;}
if (!fork()) { char* msg = "连接上了,来自服务端的消息。\n"; if (send(clientFd, msg, sizeof(msg), 0) == -1) { printf("send 出错!"); close(clientFd); exit(0); }}close(clientFd);
这段代码实现了一个TCP客户端程序,主要使用了socket()
、connect()
和recv()
函数完成连接和数据接收。以下是代码的详细说明:
#include#include #include #include #include #include #include #include
#define SERPORT 3333#define MAXDATASIZE 100char* DES = "127.0.0.1"; // 目的地址int main(int argc, char* *argv) { struct hostent *host; int sockfd; // 如果无需指定服务器地址,可以省略这一部分 if ((host = gethostbyname(DES)) == NULL) { printf("gethostbyname错误!"); exit(1); } printf("目的地址为:%s\n", host->h_name);
htons()
转换端口号,servAddr
结构体存储服务器地址信息。struct sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(SERPORT);servAddr.sin_addr = *((struct in_addr *)host->h_addr);bzero(&servAddr.sin_zero, 8);if (connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) == -1) { printf("连接出错\n"); exit(1);}printf("连接成功。\n");
buf
中。如果接收失败,会打印错误信息。int recvbytes = 0;char buf[MAXDATASIZE];if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { printf("接收出错!"); exit(1);}buf[recvbytes] = '\0';printf("收到信息:%s\n", buf);
printf("结束\n");close(sockfd);return 0;}
以上代码示例展示了TCP协议在服务器端和客户端的典型应用,实现了基本的连接监听和数据交互功能。无论是服务器端的listen()
逻辑,还是客户端的connect()
和recv()
逻辑,都体现了TCP协议在网络通信中的重要作用。
转载地址:http://sywfk.baihongyu.com/