(echoサーバ)C言語を用いてLinux上でマルチスレッドのTCP受信データを実現し,同じデータを返すネットワークプログラミング
12414 ワード
目次
linuxのネットワークプログラミングでは、TCPプロトコルは私たちが最もよく使ういくつかのプロトコルの一つであり、今日はTCPプロトコルを使用してマルチスレッドの返信プログラム(echoサーバ)を実現します.
総じてC言語を用い,メインスレッドではsocketソケットが常に傍受された状態であり,TCPクライアントリンクがあれば新しいサブスレッドを開いて処理し,受信したデータを送信者に返す.ではコードを見てみましょう
linuxのネットワークプログラミングでは、TCPプロトコルは私たちが最もよく使ういくつかのプロトコルの一つであり、今日はTCPプロトコルを使用してマルチスレッドの返信プログラム(echoサーバ)を実現します.
総じてC言語を用い,メインスレッドではsocketソケットが常に傍受された状態であり,TCPクライアントリンクがあれば新しいサブスレッドを開いて処理し,受信したデータを送信者に返す.ではコードを見てみましょう
#include
#include
#include
#include
#include
#include
#include
#include
void *TCP_client(void *arg);
int main(int argc, char const *argv[])
{
//sockfd ( )
int sockfd = socket(AF_INET,SOCK_STREAM,0);
// bind port
struct sockaddr_in my_addr;
bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(atoi(argv[1]));
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int opt = 1;
// sockfd
//
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
bind(sockfd,(struct sockaddr*)&my_addr,sizeof(my_addr));
// listen
listen(sockfd, 10);
// accept
while(1)
{
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
//
int new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &len);
//new_fd
//
char ip_str[16]="";
inet_ntop(AF_INET, &client_addr.sin_addr.s_addr,ip_str,16);
printf("ip:%s port:%hu
", ip_str, ntohs(client_addr.sin_port));
//
pthread_t tid;
pthread_create(&tid,NULL,TCP_client, (void *)new_fd);
pthread_detach(tid);
}
//
close(sockfd);
return 0;
}
void *TCP_client(void *arg)
{
int new_fd = (int)(long)arg;
// (echo )
char buf[128]="";
//
int ret = recv(new_fd, buf,sizeof(buf),0);
//
send(new_fd,buf,ret,0);
//
close(new_fd);
}