1
好,所以我有一個服務器&客戶端使用套接字和線程。C(Linux)中的套接字 - 我如何獲得客戶端IP和端口
服務器:
<Includes>...
struct sockaddr_in server;
int sock,rvsock;
int port,max,k = 0, len;
char buff[1024];
pthread_t thr[100];
void handler(int sig)
{
if(close(rvsock) < 0)
{
perror("Close.");
return;
}
}
void *worker (void* a)
{
k=0;
int ar[3];
int i=0;
char Smax[1024];
char *token;
recv(sock,&buff,sizeof(buff),0);
token = strtok(buff," ");
while(token && token!=" ")
{
int nr = atoi(token);
ar[i]=nr;
k=k+nr;
i++;
token = strtok(NULL," ");
}
if (k > max)
{
printf ("%d is indeed > than %d\n",k,max);
max=k;
}
printf("Current max is %d\n",max);
char temp[1024];
sprintf(temp,"%d",max);
strcpy(Smax,"The current maximum is: ");
strcat(Smax,temp);
strcat(Smax," and the numbers are: ");
for (i=0;i<3;i++)
{
sprintf(temp,"%d",ar[i]);
strcat(Smax,temp);
strcat(Smax," ");
}
printf ("%s\n",Smax);
send(sock, &Smax, sizeof(Smax), 0);
close(sock);
}
int main (int argc,char* argv[])
{
int i=0;
if (argc < 2)
{
perror ("No port assigned.");
exit(0);
}
else
{
sscanf (argv[1],"%d",&port);
}
/* Creating socket (AF_INET - TCP/IP) */
rvsock = socket (AF_INET,SOCK_STREAM,0);
if (rvsock<0)
{
perror("Socket was not created.");
}
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(port);
/* Binding socket */
if(bind(rvsock,(struct sockaddr*)&server,sizeof(server))<0)
perror("Error in binding socket");
else
{
printf("Server established.\nAwaying clients.\n");
}
/* Listening */
if (listen(rvsock,5)<0)
perror("Error in listening");
len = sizeof(server);
signal(SIGINT,handler);
/* Accepting and threading */
while(1 && i<100){
sock = accept (rvsock,(struct sockaddr*)&server,(socklen_t * __restrict__) &len);
if (sock<0)
{
perror("Error in accepting socket");
break;
}
pthread_create(&thr,NULL,worker,i);
i++;
}
int j;
/* Joining threads */
for (j=0;j<100;j++)
pthread_join(thr,NULL);
return 0;
客戶方:
int main(int argc,char* argv[])
{
int sock;
int k,port;
char len[1024];
char buff[1024];
struct sockaddr_in server;
if (argc<2)
{
perror ("Invalid number of args");
exit(0);
}
else
{
sscanf(argv[1],"%d",&port);
randomize(buff);
}
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
perror("Socket creation failure");
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("127.0.0.1");
server.sin_port=htons(port);
if (connect(sock,(struct sockaddr*)&server,sizeof(server))<0)
perror("Connection error");
printf("Sending input: %s\n",buff);
send(sock,buff,sizeof(buff),0);
while(1)
{
k = recv(sock,&len, sizeof(len),0);
if(k<=0)
break;
printf("Got back %s \n",len);
}
close(sock);
return 0;
服務器具有數據發送回客戶端工人功能。我需要在該數據中包含客戶端的IP和端口。
我該怎麼做?
man [accept](http://linux.die.net/man/3/accept),你需要的東西存儲在addr中。 – moeCake
可能重複的[如何顯示客戶端的IP地址在報告中使用c socket程序?](http://stackoverflow.com/questions/20235724/how-do-i-display-clients-ip-address-in-使用-C編程程序 - 報告 - ) – Michael