无法通过套接字接收字符串
我想从Java服务器向C客户端发送整数和字符串。我可以读取整数,但读取字符串时遇到问题。这是Java无法通过套接字接收字符串
ClientNumber++;
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//dos.flush();
dos.writeInt(ClientNumber);
String randomString= getRandomValue(10,20);
dos.writeUTF(randomString);
这是C客户端代码我的服务器代码:
int to_server_socket = -1;
void main (void)
{
char *server_name = SERVEURNAME;
struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;
long hostAddr;
long status;
char buffer[512];
bzero(&serverSockAddr,sizeof(serverSockAddr));
hostAddr = inet_addr(SERVEURNAME);
if ((long)hostAddr != (long)-1)
bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
else
{
serverHostEnt = gethostbyname(SERVEURNAME);
if (serverHostEnt == NULL)
{
printf("gethost rate\n");
exit(0);
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(8071);
serverSockAddr.sin_family = AF_INET;
/* creation de la socket */
if ((to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("creation socket client ratee\n");
exit(0);
}
/* requete de connexion */
if(connect(to_server_socket,
(struct sockaddr *)&serverSockAddr,
sizeof(serverSockAddr)) < 0)
{
printf("demande de connection ratee\n");
exit(0);
}
/* envoie de donne et reception */
int value = htonl(6);
int reply = 0;
if(send(to_server_socket, &value, sizeof(value), 0) != sizeof(value))
{
printf("socket write failed");
exit(-1);
}
if(recv(to_server_socket, &reply, sizeof(reply), MSG_WAITALL) != sizeof(reply))
{
printf("socket read failed");
exit(-1);
}
printf("got reply: %d\n", ntohl(reply));
char myString[30] = "";
ssize_t nbytes=0;
if ((nbytes = recv(to_server_socket, myString, sizeof(myString), 0)) < 0)
{
perror("recv");
exit(1);
}
myString[nbytes - 1] = '\0';
printf("Recived String : %s",myString);
}
结果我得到了我的号码,然后“套接字读取失败的字符串”的消息。 如果我不这样做测试过我没有任何结果
char myString[20] = "";
recv(to_server_socket, &myString, sizeof(myString), 0);
麻烦的是与以下行:
char myString[30] = "";
if(recv(to_server_socket, &myString, sizeof(myString), 0) != sizeof(myString))
你确定你是从Java发送串是30个字符。在上面的行中,您正在检查recv的返回值以查看值是否为30,但情况可能并非如此。
只需打印recv的返回值并查看它是否获取任何数据以及该数据中存在多少个字符。
不,它是一个随机的字符串,介于10和20之间,最多为30,最多为 – user2328999 2013-05-04 12:15:09
但是,如果它是一个10到20个字符之间的随机字符串,然后最多只能有20个字符。所以,recv函数将只接收20个字符,所以,条件将失败。所以,我想现在,你必须清楚这个问题。 – Jay 2013-05-04 12:16:47
我用20试过了,它不起作用,所以我想用30,因为有可能在字符串C中的其他一些caracther像字符串末尾的\ 0 – user2328999 2013-05-04 12:19:36
您可以使用WireShark或其他软件监视网络流量,并检查字符串是否正确传递? – Pietu1998 2013-05-04 12:08:57
与java客户端它的工作完美 – user2328999 2013-05-04 12:10:41
您的错误检查不_look_有效的字符串大小写。为什么发送的字符串长达30个字符? – Mat 2013-05-04 12:10:48