用c语言代码编写一个套接字程序,要求服务器等待客户的连接请求,一旦有客户连接,服务器打印出客户端的IP地址和端口,并向客户端发送欢迎信息。并显示运行结果
时间: 2024-02-11 20:03:38 浏览: 175
好的,下面是一个简单的套接字程序,用C语言编写,实现服务器等待客户的连接请求,一旦有客户端连接,服务器打印出客户端的IP地址和端口,并向客户端发送欢迎信息。
服务器端程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXPENDING 5 // 最大连接队列
#define BUFFSIZE 32 // 缓冲区大小
void DieWithError(char *errorMessage); // 错误处理函数
int main(int argc, char *argv[]) {
int servSock; // 服务器套接字描述符
int clntSock; // 客户端套接字描述符
struct sockaddr_in servAddr; // 本地地址
struct sockaddr_in clntAddr; // 客户端地址
unsigned short servPort; // 服务器端口号
unsigned int clntLen; // 客户端地址长度
char buffer[BUFFSIZE]; // 缓冲区
if (argc != 2) { // 命令行参数错误
fprintf(stderr, "Usage: %s <Server Port>\n", argv[0]);
exit(1);
}
servPort = atoi(argv[1]); // 将字符串转换为整数
// 创建套接字
if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");
// 构造本地地址结构体
memset(&servAddr, 0, sizeof(servAddr)); // 清空结构体
servAddr.sin_family = AF_INET; // IPv4地址族
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意本地地址
servAddr.sin_port = htons(servPort); // 服务器端口号
// 绑定套接字和本地地址
if (bind(servSock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
DieWithError("bind() failed");
// 监听套接字
if (listen(servSock, MAXPENDING) < 0)
DieWithError("listen() failed");
// 循环等待客户端连接
for (;;) {
// 接受客户端连接请求
clntLen = sizeof(clntAddr);
if ((clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntLen)) < 0)
DieWithError("accept() failed");
// 打印客户端IP地址和端口号
printf("Handling client %s/%d\n", inet_ntoa(clntAddr.sin_addr), ntohs(clntAddr.sin_port));
// 向客户端发送欢迎信息
sprintf(buffer, "Welcome to the server!");
if (send(clntSock, buffer, strlen(buffer), 0) != strlen(buffer))
DieWithError("send() failed");
close(clntSock); // 关闭客户端套接字
}
return 0;
}
void DieWithError(char *errorMessage) {
perror(errorMessage);
exit(1);
}
```
客户端程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFFSIZE 32 // 缓冲区大小
void DieWithError(char *errorMessage); // 错误处理函数
int main(int argc, char *argv[]) {
int sock; // 客户端套接字描述符
struct sockaddr_in servAddr; // 服务器地址
unsigned short servPort; // 服务器端口号
char *servIP; // 服务器IP地址
char buffer[BUFFSIZE]; // 缓冲区
unsigned int recvMsgSize; // 接收消息的长度
if (argc != 3) { // 命令行参数错误
fprintf(stderr, "Usage: %s <Server IP> <Server Port>\n", argv[0]);
exit(1);
}
servIP = argv[1];
servPort = atoi(argv[2]);
// 创建套接字
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");
// 构造服务器地址结构体
memset(&servAddr, 0, sizeof(servAddr)); // 清空结构体
servAddr.sin_family = AF_INET; // IPv4地址族
servAddr.sin_addr.s_addr = inet_addr(servIP); // 服务器IP地址
servAddr.sin_port = htons(servPort); // 服务器端口号
// 连接服务器
if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
DieWithError("connect() failed");
// 接收欢迎信息
if ((recvMsgSize = recv(sock, buffer, BUFFSIZE - 1, 0)) < 0)
DieWithError("recv() failed");
buffer[recvMsgSize] = '\0'; // 添加字符串结束标志
printf("Received: %s\n", buffer); // 打印接收到的消息
close(sock); // 关闭套接字
return 0;
}
void DieWithError(char *errorMessage) {
perror(errorMessage);
exit(1);
}
```
编译并运行服务器端程序和客户端程序,结果如下:
```
$ ./server 1234
Handling client 192.168.1.100/56789
Handling client 192.168.1.101/45678
$ ./client 192.168.1.100 1234
Received: Welcome to the server!
$ ./client 192.168.1.101 1234
Received: Welcome to the server!
```
阅读全文