请高手指教我Socket程序服务器端发送数据和客户端接收数据有什么问题(有源代码)

shen_giant 2007-02-06 09:59:02
服务器端:
#include <sys/socket.h>
#include <resolv.h>
#include <cma.h>
#include <sys/ioctl.h>
typedef struct _SOCKETLIST
{
int sd;
struct _SOCKETLIST * Next;

} SocketList;

SocketList * gSocketList = NULL;
int main()
{
int listensd = -1;
int connectsd = -1;
int lEnable = 1;
int i;
int slen;
int sockreuse = 1;
int sockkeepalive = 1;
int readable_count = 0;
int maxsd;
int len = 0;
struct sockaddr_in sin;
struct sockaddr_in from;
struct timeval time_val;
fd_set readable_set1;
fd_set readable_set2;
char sBuffer[4096]="";
SocketList *pSocketList = NULL;
SocketList *pSocketListCur = NULL;
SocketList *pSocketListLast = NULL;
SocketList *pTemp=NULL;
memset((char *) &from,0,sizeof(struct sockaddr_in));
memset((char *) &sin,0,sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(atoi("7799"));

if ((listensd= socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("socket创建出错\n");
return -1;
}

if ( bind( listensd, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ) {
printf("bind error\r\n");
close( listensd );
return -1;
}
ioctl(listensd, FIONBIO, &lEnable);
setsockopt(listensd, SOL_SOCKET, SO_REUSEADDR, &sockreuse, sizeof(sockreuse));
setsockopt(listensd, SOL_SOCKET, SO_KEEPALIVE, &sockkeepalive, sizeof(sockkeepalive));

if(listen(listensd, 5 )<0) {
printf("listen error\r\n");
close(listensd);
return -1;
}
printf("listen ok\r\n");
FD_ZERO(&readable_set1);
FD_ZERO(&readable_set2);
FD_SET(listensd,&readable_set2);
maxsd = listensd+1;
for(;;)
{

time_val.tv_sec = 1;
time_val.tv_usec = 0;
memcpy(&readable_set1,&readable_set2, sizeof(fd_set));
readable_count = select(maxsd,&readable_set1,NULL,NULL,&time_val);
memset(sBuffer,0x00,sizeof(sBuffer));
if( 0 == readable_count){
/*goto next;*/
continue;
}else if(readable_count < 0)
{
break;
}else if (FD_ISSET(listensd,&readable_set1))
{

lEnable = 0;
ioctl(listensd, FIONBIO, &lEnable);
connectsd = accept( listensd, &from, &len );
printf("Accept a new Client|%d|\n",connectsd);
lEnable = 1;
ioctl(listensd, FIONBIO, &lEnable);
FD_SET(connectsd, &readable_set2);
maxsd = (connectsd > listensd ? connectsd : listensd) + 1;
pSocketList = (SocketList * ) malloc(sizeof(SocketList));
if(pSocketList == NULL)
{
printf("malloc error\n");
return -1;
}

pSocketList->sd = connectsd;
pSocketList->Next = gSocketList;
gSocketList = pSocketList;



}
/*next:*/
pSocketListCur = gSocketList;
pSocketListLast = pSocketListCur;
while(pSocketListCur)
{

if (FD_ISSET(pSocketListCur->sd,&readable_set1))
{
lEnable = 1;
ioctl(listensd, FIONBIO, &lEnable);
if(recv(pSocketListCur->sd,sBuffer,4095,0)<=0)
{
printf("Client closed|%d|\r\n",pSocketListCur->sd);
close(pSocketListCur->sd);

if(pSocketListCur->sd == gSocketList->sd)//表头
{
gSocketList = gSocketList->Next;
FD_CLR(pSocketListCur->sd,&readable_set2);
free(pSocketListCur);
pSocketListCur=NULL;
pSocketListCur=pSocketListLast->Next;
continue;

}else //中间的节点
{

pSocketListLast->Next = pSocketListCur->Next;
FD_CLR(pSocketListCur->sd,&readable_set2);
free(pSocketListCur);
pSocketListCur=NULL;
pSocketListCur=pSocketListLast;
continue;
}


}else
{
printf("we receive from client :|%d %s|\r\n",pSocketListCur->sd,sBuffer);
pTemp=gSocketList;
while(pTemp)
{
if(pTemp!=pSocketListCur)
for(i=0;i<5000;i++)
{

slen=strlen(sBuffer);
if(send(pTemp->sd,&slen,2,0)<=0)
continue;
if(send(pTemp->sd,sBuffer,strlen(sBuffer),0)<=0)
continue;
}
pTemp=pTemp->Next;
}
}
}
pSocketListLast = pSocketListCur;
pSocketListCur = pSocketListCur->Next;
}
//printf("test\r\n");

}
}




客户端(主要是接收数据有没有问题):
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "unistd.h"
#include <sys/socket.h>
#include "sys/types.h"
#include "sys/wait.h"
#include "netinet/in.h"
#include <resolv.h>
#include <sys/ioctl.h>
int action()
{
exit(0);
return 0;
}
static int i;
int main()

{

struct sockaddr_in my_addr;
struct sockaddr_in serv_addr;
int sd = -1;
int c;
int len;
int slen;
char sBuf[4096]="";
char sBuffer[4096]="";
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(atoi("7799"));
serv_addr.sin_addr.s_addr = inet_addr("134.77.5.8");
memset(serv_addr.sin_zero,0x00,8);
my_addr.sin_family=AF_INET;
//my_addr.sin_port=htons(atoi(glsPort));
my_addr.sin_addr.s_addr = INADDR_ANY;
i=0;
memset(my_addr.sin_zero,0x00,8);

if ((sd= socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("socket创建出错\n");
return -1;
}
if(connect(sd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
printf("connect error |%s|\n",strerror(errno));
return -1;
}

printf("connect ok\r\nsend your command to server please!\r\ninput \"exit\" to stop\r\n");
if(!(c=fork()))
{
/*signal(SIGUSR1,action);*/
for(;;)
{
if(recv(sd,&len,2,0)<=0)
{
perror("recv");
close(sd);
exit(0);
}

if((slen=recv(sd,sBuffer,len,0))<=0)
{
perror("recv");
close(sd);
exit(0);
}
else
{
if(slen<len)
if(recv(sd,sBuf,len-slen,0)<=0)
{
perror("recv");
close(sd);
exit(0);
}
else
strcat(sBuffer,sBuf);
printf("\nReceived:%s",sBuffer);
i++;
printf("%d\n",i);
memset(sBuffer,0x00,sizeof(sBuffer));
}
}
}

for(;;)
{

gets(sBuf);

if(!strcmp(sBuf,"exit"))
{
close(sd);
if(c>0)
kill(c,SIGKILL);
exit(0);
}

if(send(sd,sBuf,strlen(sBuf),0)<=0)
{
printf("send error\r\n");
}else
printf("send ok\r\n");

}

}








...全文
358 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧