服務端程式
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加載1.1版本的套接字庫
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
//創建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
//系結
SOCKADDR_IN addrSrc;
addrSrc.sin_family=AF_INET;
addrSrc.sin_port=htons(7000);
addrSrc.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(sockSrv,(SOCKADDR*)&addrSrc,sizeof(SOCKADDR));
//將套接字設定為監聽模式
listen(sockSrv,5);
SOCKADDR_IN addrClient;//接受客戶端地址資訊
int len=sizeof(SOCKADDR);
while(1)//等待客戶的連接請求
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);//向客戶端發送資料
char recvBuf[100];
recv(sockConn,recvBuf,100,0);//客戶端接收資料
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加載1.1版本的套接字庫
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);
closesocket(sockClient);
WSACleanup();
}
uj5u.com熱心網友回復:
應該是遇到了未初始化的字串uj5u.com熱心網友回復:
網上說把recvBuf,和sendBuf初始化為0 ,我試過,之后運行結果就是什么也不現實!!!
uj5u.com熱心網友回復:
網上說把recvBuf,和sendBuf初始化為0 ,我試過,之后運行結果就是什么也不顯示!!!
uj5u.com熱心網友回復:
服務器和客戶端的所有buf(send和recv都要清0):char sendBuf[100]={0};uj5u.com熱心網友回復:
你把客戶端的recv(sockClient,recvBuf,100,0);這個函式的回傳值列印出來看看你就知道了。uj5u.com熱心網友回復:
說明你的程式有問題, 長時間可能會很燙如果很多 燙燙燙.......
小心燒了機器
問題的原因樓上都說了...
uj5u.com熱心網友回復:
char recvBuf[100] = {'0'};uj5u.com熱心網友回復:
主要是陣列長度沒有正常的結束符,導致訪問越界等。uj5u.com熱心網友回復:
燙燙燙不是真的燙,大多數都是buffer沒有zeromemory,或者訪問越界導致的
uj5u.com熱心網友回復:
void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
uj5u.com熱心網友回復:
你的客戶端少了判斷,如果沒先打開服務器,你是連接不是服務器的,沒連服務器當然沒有收到資料,然而你的代碼是不管有沒有收到資料你都列印出來,列印了未初始化的資料當然是亂碼了我給改了一下你看看有沒有用
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32")
void main()
{
//加載1.1版本的套接字庫
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7000);
if(SOCKET_ERROR==connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
printf("%s%d\n","無法連接服務器:",::WSAGetLastError());
closesocket(sockClient);
WSACleanup();
system("pause");
return;
}
char recvBuf[100];
if(SOCKET_ERROR ==recv(sockClient,recvBuf,100,0))
{
printf("%s%d\n","接收失敗:",::WSAGetLastError());
closesocket(sockClient);
WSACleanup();
system("pause");
return;
}
printf("%s\n",recvBuf);
if(SOCKET_ERROR ==send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0))
{
printf("%s%d\n","發送失敗:",::WSAGetLastError());
}
closesocket(sockClient);
WSACleanup();
system("pause");
}
uj5u.com熱心網友回復:
感謝回復,我試過了依然是燙燙燙!!!
uj5u.com熱心網友回復:
這個意思是??看不懂啊,大哥!!uj5u.com熱心網友回復:
試過了,這樣之后 服務端和客戶端 都不顯示結果了!!uj5u.com熱心網友回復:
呼叫該函式,顯示你緩沖區中的每個位元組。
uj5u.com熱心網友回復:
讓我想起 tuber c,視窗模式的tuber c就會出現很多 燙燙燙燙 吶吶吶吶 的uj5u.com熱心網友回復:
我幫你試了,沒有亂碼,你編譯器有問題~
uj5u.com熱心網友回復:
recvBuf[接收長度]=0;printf("%s\n",recvBuf);
uj5u.com熱心網友回復:
我幫你試了,沒有亂碼,你編譯器有問題~
uj5u.com熱心網友回復:
請問你用的是哪個編譯器?我用的VS2012的
我幫你試了,沒有亂碼,你編譯器有問題~
vs2015
uj5u.com熱心網友回復:
不知道有多少前人掉在TCP Socketsend(人多)send(病少)send(財富)
recv(人多病)recv(少財富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
uj5u.com熱心網友回復:
樓主,你的問題最后是怎么解決的?uj5u.com熱心網友回復:
都是從燙燙里面過來的,不虛不虛!、uj5u.com熱心網友回復:
“Welcome %s to http://www.sunxin.org”這句話太長了,改短就不燙了。uj5u.com熱心網友回復:
char recvBuf[100] = {0};recv(sockClient,recvBuf, _countof(recvBuf) - 1,0);類似的地方都修改一下,同時判斷recv的回傳值,看看接受的資料完整了沒?如果沒有收完,就回圈接收。
uj5u.com熱心網友回復:
燙燙燙燙燙燙燙燙燙燙是沒有初始化的資料直接發送導致的,發送時將發送空間先置0再寫入發送資料,然后再發送
uj5u.com熱心網友回復:
windows里常見的記憶體填充資料含義
* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
漱 * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers
涵? * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
很? * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
撅飾 * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files
燙燙 * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
屯屯 * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
葺葺 * 0xDDDDDDDD : Used by Microsoft's free() or delete to mark freed heap memory
蘄蘄 * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash
* 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory
uj5u.com熱心網友回復:
recv(sockConn,recvBuf,100,0);/沒有回傳資料,是超時回傳的
uj5u.com熱心網友回復:
recv前先memset(recvBuf,0,sizeof(recvBuf));uj5u.com熱心網友回復:
char sendBuf[100]="";陣列要初始化為空
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
#27正解!
uj5u.com熱心網友回復:
多燙幾次就好了,關鍵水還沒開。該說的大家都說完了,想不燙,用陣列的時候先初始化uj5u.com熱心網友回復:
這個問題我也試了,我用除錯服務器端跟蹤sendBuf是沒有問題的,除錯程序中發現客戶端是不能用ctrl+F5啟動,要先生成exe檔案到目錄中運行。這時就能出現正確結果了,我用的是VS2015,應該是客戶端在CMD中運行造成的錯誤。uj5u.com熱心網友回復:
我試過網上其它的要初始化陣列、結尾加0這些都不用。uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
就按照視頻一步一步來,我今天剛學 VS2010,妥妥的~沒毛病
uj5u.com熱心網友回復:
字串沒有以空字符 \0結束造成的:有些地方是程式自動加上空字符,這種情況一定要給出正確的字串長度值,才能讓程式在字串的末尾加上空字符;有些不是自動加上空字符的,這些地方就需要自己在字串末尾加上空字符。還有,當中文字符(雙位元組)和英文(單位元組)的字符混在一起的時候,更容易出現這類錯誤。解決辦法是使用UNICODE字符集,漢字英文通通以雙位元組存盤。不過,同樣會出現空字符的上述兩種情況,根據情況解決就是了。
uj5u.com熱心網友回復:
燙燙燙不是真的燙。檢查緩沖區是否足夠大?有沒有初始化?
uj5u.com熱心網友回復:
char recvBuf[100];int nRecvLen = recv(sockConn,recvBuf,100,0);//客戶端接收資料
if(nRecvLen>0)
{
recvBuf[nRecvLen] = '\0';
printf("%s\n",recvBuf);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/35231.html
標籤:網絡編程
