- 论坛徽章:
- 0
|
小弟初学socket编程,现在遇到了这样的问题。
当client连接上server后,使用recv接收server发过来的数据,但却无法recv返回,看了书以后知道这是因为recv没有收到足够的数据所以不能返回,但是在windows下的C/S不管是否有足够的数据,也能收到程序中的缓冲区中,但如果windows与solaris通讯,似乎收不到数据?
代码如下,请高手指点!
[client.c]
#include "stdafx.h"
#include "winsock2.h"
int main(int argc, char* argv[])
{
WSADATA wData;
SOCKET sClient;
struct sockaddr_in sinServer;
unsigned short iPort=34910;
char sbuffer[30];
char rbuffer[30];
int rx_bytes=-1;
unsigned long ul=1;
int nRet;
memset((void *)sbuffer,0,sizeof(sbuffer));
memset((void *)rbuffer,0,sizeof(rbuffer));
printf("%s\n",sbuffer);
if(WSAStartup(MAKEWORD(2,2),&wData)!=0)
{
printf("Failed to load Winsock!\n" ;
return 1;
}
sinServer.sin_family=AF_INET;
sinServer.sin_port=htons(iPort);
sinServer.sin_addr.s_addr=inet_addr("192.168.2.102" ;
sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
connect(sClient,(struct sockaddr *)&sinServer,sizeof(sServer));
printf("connect error code is %d\t\n",WSAGetLastError());
sprintf(sbuffer,"This is a test!" ;
printf("%s\n",sbuffer);
send(sClient,sbuffer,strlen(sbuffer),0);
printf("send error code is %d\t\n",WSAGetLastError());
printf("begin receive!\n" ;
while(1)
{
recv(sClient,rbuffer,30,0);
printf("receive error code is %d\t\n",WSAGetLastError());
printf("%d",rx_bytes);
printf("%s\n",rbuffer);
}
return 0;
}
[server.c]
#include <stdio.h>;
#include <stdlib.h>;
#include <errno.h>;
#include <string.h>;
#include <sys/types.h>;
#include <netinet/in.h>;
#include <sys/socket.h>;
#include <sys/wait.h>;
#include <netdb.h>;
#include <signal.h>;
#define MYPORT 34910
#define BACKLOG 10
int n;
char buf[2048];
char buf1[]="this is test!\n";
void main()
{
int listenfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
if ((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket" ;
exit(1);
}
bzero(&(my_addr),sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
if ((bind(listenfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1))
{
perror("bind" ;
exit(1);
}
if (listen(listenfd,BACKLOG)==-1)
{
perror("listen" ;
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if ((new_fd==accept(listenfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
{
if (errno==EINTR)
continue;
perror("accept" ;
continue;
}
printf("server:got connection form %s\n",inet_ntoa(their_addr.sin_addr));
write(new_fd,buf1,strlen(buf1));
close(new_fd);
}
}
client.c环境:windows XP+Visual C++
server.c环境:solaris 9+Forte C |
|