server.c端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h> // For close()
#define SERVER_PORT 8888
int main() {
int serverSocket;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
int clientsocket;
char buffer[200];
int iDateNum;
// 创建服务端套接字
if ((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
return 1;
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定套接字
if (bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
close(serverSocket);
return 1;
}
// 开始监听
if (listen(serverSocket, 5) < 0) {
perror("listen");
close(serverSocket);
return 1;
}
printf("监听端口:%d\n", SERVER_PORT);
// 接受客户端连接
clientsocket = accept(serverSocket, (struct sockaddr *)&client_addr, &addr_len);
if (clientsocket < 0) {
perror("accept");
close(serverSocket);
return 1;
}
printf("等待消息...\n");
printf("IP is %d\n", inet_ntoa(client_addr.sin_addr));
printf("Port is %d\n", ntohs(client_addr.sin_port));
while (1) {
buffer[0] = '\0';
iDateNum = recv(clientsocket, buffer, 1024, 0);
if (iDateNum <= 0) {
break;
}
buffer[iDateNum] = '\0';
if (strcmp(buffer, "quit") == 0) {
break;
}
printf("收到消息:%s\n", buffer);
printf("发送消息:");
scanf("%199s", buffer); // 防止缓冲区溢出
send(clientsocket, buffer, strlen(buffer), 0);
if (strcmp(buffer, "quit") == 0) {
break;
}
}
close(clientsocket);
close(serverSocket);
return 0;
}
client.c端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h> // for close()
#define SERVER_PORT 8888
int main() {
int serverSocket;
struct sockaddr_in server_addr;
char sendbuf[200];
char recvbuf[200];
int iDateNum;
// 创建客户端套接字
if ((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
return 1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 连接服务端
if (connect(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect");
close(serverSocket);
return 1;
}
printf("连接到主机...\n");
// 发送接收消息
while (1) {
printf("发送消息: ");
if (fgets(sendbuf, sizeof(sendbuf), stdin) == NULL) {
perror("fgets");
break;
}
// 去除换行符
sendbuf[strcspn(sendbuf, "\n")] = 0;
send(serverSocket, sendbuf, strlen(sendbuf), 0);
if (strcmp(sendbuf, "quit") == 0) break;
printf("读取消息:");
iDateNum = recv(serverSocket, recvbuf, sizeof(recvbuf) - 1, 0);
if (iDateNum < 0) {
perror("recv");
break;
}
recvbuf[iDateNum] = '\0';
printf("%s\n", recvbuf);
}
close(serverSocket);
return 0;
}