linux套接字端口,C(Linux)中的套接字 - 我如何获得客户端IP和端口

服务器:

...

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和端口。

我该怎么做?

+4

man [accept](http://linux.die.net/man/3/accept),你需要的东西存储在addr中。 –

+1

可能重复的[如何显示客户端的IP地址在报告中使用c socket程序?](http://stackoverflow.com/questions/20235724/how-do-i-display-clients-ip-address-in-使用-C编程程序 - 报告 - ) –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值