寫了個回聲客戶端和服務端,服務端將客戶端發來的字串再發回給客戶端。
但是當recv設定的len大小和客戶端send的不一致就有問題,第一次接識訓好,第二次再打一行字串,客戶端的sent函式就回傳-1了,錯誤號10038,。但是如果兩邊的buf大小設定一致就沒問題,我實在搞不清哪里錯了,好心人幫我看下吧。
客戶端
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define MAX_LEN 1024
int main(int argc,char* argv[])
{
//printf("%s",argv[0]);
WSADATA wsaData; //無特殊含義
SOCKET hSocket; //套接字句柄
SOCKADDR_IN servAddr;
char message[30];
char info[MAX_LEN];
int strLen;
int strlen = 0;
int count = 0;
if (argc != 3)
{
printf("Usage :%s<IP> <port>\n",argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { //必須先呼叫該函式輸入版本資訊
printf("error:WSAStartup fail!");
exit(1);
}
hSocket = socket(PF_INET,SOCK_STREAM,0);//ipv4,流式套接字,自配置型別
if (hSocket == INVALID_SOCKET) {
printf("error:Socket fail!");
exit(1);
}
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = inet_addr((const char*)argv[1]);//將字串轉換為整型的同時進行位元組序轉換
servAddr.sin_port = htons(atoi((const char*)argv[2]));//位元組序轉換
int error = connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr));
if (error== SOCKET_ERROR) { //發出連接請求
int err = WSAGetLastError();
printf("error:Connect fail!##%d",err);
exit(1);
}
//接收資料
while (1)
{
fputs("Input message(Q to quit:", stdout);//從標準輸出列印,
fgets(info, 1024, stdin);//從標準輸入讀取
if (!strcmp(info, "q\n"))
break;
//while (strlen = recv(hsocket, message + strlen, 1, 0)) {
// if (strlen == -1) {
// printf("error:read fail!");
// //exit(1);
// }
// strlen += strlen;
//}
int str_len = send(hSocket, info, MAX_LEN, 0); //為什么第二次send連不上了?
if (str_len == -1) {
int ret2 = WSAGetLastError();
printf("%d",ret2);
}
printf("\n%d",str_len);
int recv_len = 0;
int recv_cnt = 0;
memset(info, 0, MAX_LEN);
while (recv_len<str_len){
recv_cnt = recv(hSocket, info+recv_len, MAX_LEN, 0);
printf("\n%d",recv_cnt);
recv_len += recv_cnt;
}
printf("Meesage is %s\n",info);
//printf("Message fom server :%s \n", message);
}
closesocket(hSocket);
WSACleanup();
system("pause");
return 0;
}
服務端
#include<stdio.h>
#include<stdlib.h>
#include <WinSock2.h>
void ErrorHandling(const char* message);
#define MAX_LEN 600
int main(int argc, char* argv[])
{
int count = 0;
WSADATA wsaData;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;
char info[MAX_LEN];
int szClntAddr;
char message[] = "Hello World!";
if (argc != 2)
{
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling("WSAStarup() error!");
hServSock = socket(PF_INET, SOCK_STREAM, 0);
if (hServSock == INVALID_SOCKET)
ErrorHandling("socket() error");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //機器可能不止一塊網卡
servAddr.sin_port = htons(atoi((const char*)argv[1]));
if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
ErrorHandling("bind() error");
if (listen(hServSock, 5) == SOCKET_ERROR)
ErrorHandling("listen() error");
szClntAddr = sizeof(clntAddr);
while (count<5) {
printf("listening...\n");
hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
if (hClntSock == INVALID_SOCKET)
ErrorHandling("accept() error");
else
printf("connect client %d\n",count);
//send(hClntSock, message, sizeof(message), 0);
int ret;
int str_len = 0;
while ((ret = recv(hClntSock, info, sizeof(info), 0))>0) //發送緩沖區和接識訓沖區一致最好
{
printf("\n%d",ret);
send(hClntSock, info, sizeof(info), 0);
}
closesocket(hClntSock);
printf("\n");
count++;
}
closesocket(hServSock);
WSACleanup();
return 0;
}
void ErrorHandling(const char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
uj5u.com熱心網友回復:
如果服務器端的MAX_LEN設定成600或者2048都會出現上述問題
uj5u.com熱心網友回復:
我現在認為是客戶端的recv_cnt = recv(hSocket, info+recv_len, MAX_LEN, 0);
這句話有問題,這句話注釋掉就沒事了,如果第一次接收600,第二次接收600,緩沖區越界,導致不能再連接?
uj5u.com熱心網友回復:
不要把send放到while里,先把收到的資料快取起來,全部收下后,再send。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/48640.html
標籤:網絡通信
上一篇:關于TCAM表的問題求教
下一篇:面試題精選:資料偽造
