?? multi_client(linux socket
字號(hào):
// multi_thread_client.c
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <pthread.h>
#include <sys/errno.h> // for errno
#define HELLO_WORLD_SERVER_PORT 6666
#define BUFFER_SIZE 1024
char * server_IP = NULL;
void * talk_to_server(void * thread_num)
{
//設(shè)置一個(gè)socket地址結(jié)構(gòu)client_addr,代表客戶機(jī)internet地址, 端口
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr)); //把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為0
client_addr.sin_family = AF_INET; //internet協(xié)議族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自動(dòng)獲取本機(jī)地址
client_addr.sin_port = htons(0); //0表示讓系統(tǒng)自動(dòng)分配一個(gè)空閑端口
//創(chuàng)建用于internet的流協(xié)議(TCP)socket,用client_socket代表客戶機(jī)socket
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket < 0)
{
printf("Create Socket Failed!\n");
exit(1);
}
//把客戶機(jī)的socket和客戶機(jī)的socket地址結(jié)構(gòu)聯(lián)系起來
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit(1);
}
//設(shè)置一個(gè)socket地址結(jié)構(gòu)server_addr,代表服務(wù)器的internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(server_IP,&server_addr.sin_addr) == 0) //服務(wù)器的IP地址來自程序的參數(shù)
{
printf("Server IP Address Error!\n");
exit(1);
}
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//向服務(wù)器發(fā)起連接,連接成功后client_socket代表了客戶機(jī)和服務(wù)器的一個(gè)socket連接
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
{
printf("Can Not Connect To %s!\n",server_IP);
exit(1);
}
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
//從服務(wù)器接收數(shù)據(jù)到buffer中
int length = recv(client_socket,buffer,BUFFER_SIZE,0);
if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", server_IP);
exit(1);
}
printf("From Server %s :\t%s",server_IP,buffer);
bzero(buffer,BUFFER_SIZE);
sprintf(buffer,"Hello, World! From Client Thread NUM :\t%d\n",(int)thread_num);
//向服務(wù)器發(fā)送buffer中的數(shù)據(jù)
send(client_socket,buffer,BUFFER_SIZE,0);
//關(guān)閉socket
close(client_socket);
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: ./%s ServerIPAddress\n",argv[0]);
exit(1);
}
server_IP = argv[1];
pthread_t child_thread;
pthread_attr_t child_thread_attr;
pthread_attr_init(&child_thread_attr);
pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
int i=0;
for(i=0; i<10000; i++)
{
if( pthread_create(&child_thread,&child_thread_attr,talk_to_server, (void *)i) < 0 )
printf("pthread_create Failed : %s\n",strerror(errno));
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -