使用linux C,利用TCP实现一个客户端和一个服务端,客户端实现的内容为将用户输入的字符发送到服务端,服务端实现的内容为将接收到的客户端内容转化为大写字母后再发送给客户端,并且打印出发送信息的客户端IP和端口号,服务端要通过多线程实现并发访问
时间: 2023-06-13 14:02:23 浏览: 119
好的,您的问题是如何使用Linux C,利用TCP实现一个客户端和一个服务端,客户端将用户输入的字符发送到服务端,服务端将接收到的客户端内容转化为大写字母后再发送给客户端,并且打印出发送信息的客户端IP和端口号,服务端要通过多线程实现并发访问。
下面是解答:
服务端代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <pthread.h>
#define MAXLINE 1024
#define SERV_PORT 8000
#define LISTENQ 5
void *handle_client(void *arg) {
int sockfd = *((int *)arg);
char buf[MAXLINE];
char ip[INET_ADDRSTRLEN];
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(clientaddr);
getpeername(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_len);
const char *client_ip = inet_ntop(AF_INET, &clientaddr.sin_addr, ip, INET_ADDRSTRLEN);
int client_port = ntohs(clientaddr.sin_port);
printf("New connection from %s:%d\n", client_ip, client_port);
while(1) {
int n = recv(sockfd, buf, MAXLINE, 0);
if(n <= 0) {
printf("Connection closed from %s:%d\n", client_ip, client_port);
break;
}
printf("Received message from %s:%d: %s\n", client_ip, client_port, buf);
for(int i = 0; i < n; i++) {
buf[i] = toupper(buf[i]);
}
send(sockfd, buf, n, 0);
}
close(sockfd);
return NULL;
}
int main(int argc, char *argv[]) {
int listenfd;
pthread_t tid;
struct sockaddr_in servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
printf("Server running on port %d...\n", SERV_PORT);
while(1) {
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(clientaddr);
int *connfd = (int *)malloc(sizeof(int));
*connfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientaddr_len);
pthread_create(&tid, NULL, handle_client, connfd);
pthread_detach(tid);
}
return 0;
}
```
客户端代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#define MAXLINE 1024
#define SERV_PORT 8000
int main(int argc, char *argv[]) {
int sockfd;
char buf[MAXLINE];
struct sockaddr_in servaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
printf("Enter message: ");
fgets(buf, MAXLINE, stdin);
send(sockfd, buf, strlen(buf), 0);
int n = recv(sockfd, buf, MAXLINE, 0);
printf("Received message: %s\n", buf);
close(sockfd);
return 0;
}
```
这里我们使用了 pthread 库来实现多线程,每次有客户端连接时,就会创建一个新的线程来处理该客户端的请求,这样可以实现并发访问。
注意,此示例中服务端无法处理多个连接,建议您进行改进。
阅读全文