lw1a2 2007年01月03日
socket小程序,变量莫名其妙改变
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <errno.h>

void* client(void* p)
{
int sockfd, new_fd, i=0, j=0, nbytes;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char *tmp=(char*)p;

char ip[20],port[6];

while(tmp[i]!=':')
{
ip[i]=tmp[i];
i++;
}
ip[i++]='\0';

while(tmp[i]) port[j++]=tmp[i++];
port[j]='\0';


for (i=0; i<10000; ++i)
{
sockfd=socket(AF_INET, SOCK_STREAM, 0);
if (sockfd==-1)
{
printf("Client Error. %s\n", strerror(errno));
return;
}

s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(port));//第二次循环的时候,port变了
s_addr.sin_addr.s_addr = inet_addr(ip);
bzero(&(s_addr.sin_zero), sizeof(s_addr.sin_zero));


while (connect(sockfd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr))==-1)
{
printf("Client Error. %s\n", strerror(errno));
}

char buffer[10];

if((nbytes=read(sockfd,buffer,1024))==-1)
{
printf("Client Error. %s\n", strerror(errno));
}

if (buffer[0]=='M')
printf("%s\n",buffer);

close(sockfd);
}
return;
}


int main(int argc, char* argv[])
{

if (argc<2)
{
printf("Usage: 1.out server's IP:server's port");
printf("Example: 1.out 192.168.0.1:4444\n");
return -1;
}

client(argv[1]);

return 0;
}
---------------------------------
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <errno.h>

void* server(void* p)
{
int sockfd, new_fd, i=0, j=0;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char *tmp=(char*)p;

char ip[20],port[6];

while(tmp[i]!=':')
{
ip[i]=tmp[i];
i++;
}
ip[i++]='\0';

while(tmp[i]) port[j++]=tmp[i++];
port[j]='\0';

sockfd=socket(AF_INET, SOCK_STREAM, 0);
if (sockfd==-1)
{
printf("Server Error. %s\n", strerror(errno));
return;
}

s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(port));
s_addr.sin_addr.s_addr = inet_addr(ip);
bzero(&(s_addr.sin_zero), sizeof(s_addr.sin_zero));

if (bind(sockfd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr))==-1)
{
printf("Server Error. %s\n", strerror(errno));
return;
}

if (listen(sockfd, 500)==-1)
{
printf("Server Error. %s\n", strerror(errno));
return;
}

char s[32], c[6];

for (i=0; i<10000; ++i)
{
s[0]='\0';
if (i%3==0) strcpy(s, "M");
sprintf(c,"%d",i);
strcat(s, c);
strcat(s, "\n");

if ((new_fd = accept(sockfd, NULL, NULL))==-1)
printf("Server Error. %s\n", strerror(errno));
printf("%s\n", s);
write(new_fd, s, sizeof(s));
close(new_fd);
}

close(sockfd);
return;
}



int main(int argc, char* argv[])
{

if (argc<2)
{
printf("Usage: 1.out server's IP:server's port client's");
printf("Example: 1.out 192.168.0.1:4444\n");
return -1;
}

server(argv[1]);

return 0;
}
-----------------------------
用gdb跟踪客户端程序,发现port自己变了,导致connect失败,不知道为何
gcc 3.2.2
...全文
151 点赞 收藏 7
写回复
7 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告