【发布时间】:2014-02-21 17:18:05
【问题描述】:
在我运行服务器之后,我运行了两个客户端实例。现在我第一次运行客户端时,接收到的数据被保存到数组 [0] 中,但是当我运行第二个客户端时,数组 [0] 的值令人惊讶地被新值覆盖。新数据应保存在数组 [1] 中,而不是覆盖。我犯了什么错误?
char *Array[100]; int ArrayCount = 0;是全局变量。
void *server()
{
int listenfd = 0;
connfd = 0;
struct sockaddr_in serv_addr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(port));
if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))<0)
{
perror("bind");
exit(1);
}
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
printf("data in Array[0] before recv : %s\n",Array[0]);
int ns;
char revdData[2000];
bzero(revdData,2000);
ns = recv(connfd,revdData,2000,0);
close(connfd);
printf("data in Array[0] after recv : %s\n",Array[0]);
Array[ArrayCount] = revdData;
ArrayCount = ArrayCount+1;
}
}
客户端代码
void *client()
{
int soctype = SOCK_STREAM;
struct hostent *hp, *gethostbyname();
struct sockaddr_in servR;
struct servent *seR;
int tempSocket;
char *host = "localhost";
if ((tempSocket = socket(AF_INET, soctype, 0)) < 0)
{
perror("socket");
exit(1);
}
if ((hp = gethostbyname(host)) == NULL)
{
exit(1);
}
servR.sin_family = AF_INET;
memcpy(&servR.sin_addr, hp->h_addr, hp->h_length);
if (isdigit(*port))
{
servR.sin_port = htons(atoi(port));
}
else
{
if ((seR = getservbyname(port, (char *)NULL)) < (struct servent *) 0)
{
perror(port);
exit(1);
}
servR.sin_port = seR->s_port;
}
if (connect(tempSocket, (struct sockaddr *) &servR, sizeof(servR)) < 0)
{
perror("connect");
exit(1);
}
char input[100];
fgets(input,100,stdin);
int n;
n=send(tempSocket,input,100,0);
if (n < 0)
{
error("Send");
}
}
输出如下:
data in Array[0] before recv : (null)
data in Array[0] after recv : (null)
data in Array[0] before recv : 1st Instance
data in Array[0] after recv : 2nd Instance
理想情况下,recv 之后的数据应该是“第一个实例”,因为我正在打印数组 [0]。
【问题讨论】:
-
struct hostent *hp, *gethostbyname();不好。相反,#include是相应的头文件。或者更好的是,将getservbyname()和gethostbyname()替换为较新的getaddrinfo()和getnameinfo()。