求高手解疑問:
服務端接收資料跟客戶端接收資料不正確。正確的應該是如下
客戶端:please enter message:liu
服務端:client say :liu
服務端:please enter message:what
客戶端:server say :what
但實際除錯的時候卻是服務端與客戶端均不能正確接收鍵盤輸入的內容,如下

最后附上原始碼:
服務器端:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment (lib, "ws2_32.lib")//加載ws2_32.dll庫檔案
int main()
{
/*.................................................*/
/*.......WSAStartup---初始化套接字庫...............*/
/*.................................................*/
WSADATA wsaData; //定義庫版本資訊結構體
WORD wVersionRequested; //定義版本型別,字(WORD):unsigned short
wVersionRequested = MAKEWORD(2, 2); //版本為2.2版,前面是低位元組,后面是高位元組
int int_WSAStartup = WSAStartup(wVersionRequested, &wsaData);//WSAStartup函式回傳值為int型別
if (int_WSAStartup != 0)
{
printf("加載套接字失敗!\n");
return 0;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) //判斷請求加載的版本號是否符合要求,||表示“或”
{
WSACleanup();
return 0;
}
/*.................................................*/
/*...............socket---創建套接字...............*/
/*.................................................*/
SOCKET socket_server = socket(AF_INET, SOCK_STREAM, 0);
/*.................................................*/
/*...............bind---系結套接字.................*/
/*.................................................*/
SOCKADDR_IN server_address;
server_address.sin_family = AF_INET; //地址家族,必須是AF_INET
server_address.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //htonl(INADDR_ANY); //主機地址
server_address.sin_port = htons(5000); //埠號
int int_bind = bind(socket_server, (struct sockaddr*)&server_address, sizeof(SOCKADDR));//bind函式回傳值為int型別
//struct sockaddr = SOCKADDR同時struct sockaddr* = SOCKADDR*
if (int_bind != 0)
{
printf("系結失敗!\n");
}
/*.................................................*/
/*........listen---設定套接字為監聽狀態............*/
/*.................................................*/
int int_listen = listen(socket_server, 5); //listen函式回傳值為int型別
if (int_listen < 0) //最大客戶端數量為5
{
printf("監聽失敗!\n");
}
/*.................................................*/
/*...........accept---接收客戶端請求...............*/
/*.................................................*/
int length = sizeof(SOCKADDR);
SOCKADDR_IN client_address;
SOCKET socket_data_transfer;
socket_data_transfer = accept(socket_server, (struct sockaddr*)&client_address, &length); //accept函式回傳值為一個新的socket型別
if (socket_data_transfer ==SOCKET_ERROR)
{
printf("接收與客戶端的連接失敗!\n");
}
/*.................................................*/
/*...........recv和send---進行聊天...............*/
/*.................................................*/
while (1)
{
/*........recv---接收資料........*/
char Receivebuf[100];//接收資料緩沖區
int int_recv = recv(socket_data_transfer, Receivebuf, 100, 0);//recv函式回傳值為int型別
if (int_recv < 0)
{
printf("接收客戶端資料失敗!\n");
printf("退出服務器端程式!\n");
break;
}
else
{
printf("client say:%s\n", Receivebuf);
}
/*........send---發送資料........*/
char Sendbuf[100];//發送資料緩沖區
printf("please enter message:");
scanf_s("%s", Sendbuf);
int int_send = send(socket_data_transfer, Sendbuf, 100, 0);//send函式回傳值為int型別
if (int_send < 0)
{
printf("服務器端發送資料失敗!\n");
}
}
/*.........................................................................*/
/*...........closesocket/WSACleanup---釋放套接字,關閉ws2_32.dll動態庫.....*/
/*.........................................................................*/
closesocket(socket_data_transfer);
closesocket(socket_server);
WSACleanup();
return 0;
}
客戶端:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment (lib, "ws2_32.lib")//加載ws2_32.dll庫檔案
int main()
{
/*.................................................*/
/*.......WSAStartup---初始化套接字庫...............*/
/*.................................................*/
WSADATA wsaData; //定義庫版本資訊結構體
WORD wVersionRequested; //定義版本型別,字(WORD):unsigned short
wVersionRequested = MAKEWORD(2, 2); //版本為2.2版,前面是低位元組,后面是高位元組
int int_WSAStartup = WSAStartup(wVersionRequested, &wsaData);//WSAStartup函式回傳值為int型別
if (int_WSAStartup != 0)
{
printf("加載套接字失敗!\n");
return 0;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) //判斷請求加載的版本號是否符合要求,||表示“或”
{
WSACleanup();
return 0;
}
/*.................................................*/
/*...............socket---創建套接字...............*/
/*.................................................*/
SOCKET socket_client = socket(PF_INET, SOCK_STREAM, 0);
/*.................................................*/
/*...............connect---連接套接字.................*/
/*.................................................*/
SOCKADDR_IN server_address;
server_address.sin_family = AF_INET; //地址家族,必須是AF_INET
server_address.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //客戶端地址
server_address.sin_port = htons(5000); //埠號
int int_connect = connect(socket_client, (struct sockaddr*)&server_address, sizeof(SOCKADDR));//connect函式回傳值為int型別
//struct sockaddr = SOCKADDR同時struct sockaddr* = SOCKADDR*
if (int_connect != 0)
{
printf("與服務器端連接失敗!\n");
}
/*.................................................*/
/*...........recv和send---進行聊天...............*/
/*.................................................*/
while (1)
{
/*........send---發送資料........*/
char Sendbuf[100];//發送資料緩沖區
printf("please enter message:");
scanf_s("%s", Sendbuf);
int int_send = send(socket_client, Sendbuf, 100, 0);//send函式回傳值為int型別
if (int_send < 0)
{
printf("客戶端發送資料失敗!\n");
}
/*........recv---接收資料........*/
char Receivebuf[100];//接收資料緩沖區
int int_recv = recv(socket_client, Receivebuf, 100, 0);//recv函式回傳值為int型別
if (int_recv < 0)
{
printf("接收服務器端資料失敗!\n");
printf("退出客戶端程式!\n");
break;
}
else
{
printf("server say:%s\n", Receivebuf);
}
}
/*.........................................................................*/
/*...........closesocket/WSACleanup---釋放套接字,關閉ws2_32.dll動態庫.....*/
/*.........................................................................*/
closesocket(socket_client);
WSACleanup();
return 0;
}
請大神幫忙看看該怎么改?,謝謝了。
uj5u.com熱心網友回復:
send(socket_client, Sendbuf, 100, 0);查看下Sendbuf里到底是什么,100改成實際長度,socket發送的是位元組流,不是字串,不一定能列印出來,要完成列印的話最好轉成16進制列印uj5u.com熱心網友回復:
怎么查看sendbuf里的資訊呢?轉換成16進制又怎么轉呢?新手小白,謝謝了。uj5u.com熱心網友回復:
直接printf不行嗎printf("Sendbuf:%s\n", Sendbuf);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/81083.html
標籤:C語言
上一篇:求大佬
下一篇:時間復雜度
