winsock编程的问题!我入门的第一个小程序就卡住了,在线求教了!
#include "stdafx.h"
#include <stdio.h>
#include <WinSock.h>
int main(int argc,char* argv[])
{
WORD wVersion;
WSADATA wsaData;
int err;
//生成版本号
wVersion=MAKEWORD(1,1);
//初始化Windows socket
err=WSAStartup(wVersion,&wsaData);
if(err!=0)
return 0;
//建立流式套接字
SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;
int nSocketErr;
addr.sin_family = AF_INET;
addr.sin_addr.S_addr = htonl(INADDR_ANY);
//设定监听端口号
addr.sin_port = htons(5001);
//绑定套接字
if(bind(listenSocket,(struct sockaddr*)&addr,
sizeof(addr))==SOCKET_ERROR)
nSocketErr = WSAGetLastError();
//将套接字设置成监听状态
if(listen(listenSocket,5) == SOCKET_ERROR)
nSocketErr=WSAGetLastError();
printf("服务器正在监听。。。\n");
//等待服务器的连接请求
SOCKET connectSocket=accept(listenSocket,NULL,NULL);
if (connectSocket==INVALID_SOCKET)
{
printf("解说错误\n");
nSocketErr = WSAGetLastError();
}
else
{
//有客户连接请求被成功接收
char buf[1024];
memset(buf,0,sizeof(char)*1024);
//接收客户端传来的数据
int n= recv(connectSocket,buf,1024,MSG_PEEK);
if(n>0)
printf("服务器已经接收%d个字符:%s",n,buf);
}
closesocket(listenSocket);
closesocket(connectSocket);
getchar();
return 0;
}
[解决办法]
应该是 addr.sin_addr.s_addr 或者 addr.sin_addr.S_un.S_addr
struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un;#define s_addr S_un.S_addr /* can be used for most tcp & ip code */#define s_host S_un.S_un_b.s_b2 /* host on imp */#define s_net S_un.S_un_b.s_b1 /* network */#define s_imp S_un.S_un_w.s_w2 /* imp */#define s_impno S_un.S_un_b.s_b4 /* imp # */#define s_lh S_un.S_un_b.s_b3 /* logical host */};struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8];};
[解决办法]
addr.sin_addr.s_addr
S应该小写。
[解决办法]
// TEST51.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "TEST51.h"
#include <WINSOCK2.H>
#pragma comment(lib, "ws2_32.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// // TODO: code your application's behavior here.
// CString strHello;
// strHello.LoadString(IDS_HELLO);
// cout << (LPCTSTR)strHello << endl;
WORD wVersion;
WSADATA wsaData;
int err;
//生成版本号
wVersion=MAKEWORD(1,1);
//初始化Windows socket
err=WSAStartup(wVersion,&wsaData);
if(err!=0)
return 0;
//建立流式套接字
SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;
int nSocketErr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//设定监听端口号
addr.sin_port = htons(5001);
//绑定套接字
if(bind(listenSocket,(struct sockaddr*)&addr,
sizeof(addr))==SOCKET_ERROR)
nSocketErr = WSAGetLastError();
//将套接字设置成监听状态
if(listen(listenSocket,5) == SOCKET_ERROR)
nSocketErr=WSAGetLastError();
printf("服务器正在监听。。。\n");
//等待服务器的连接请求
SOCKET connectSocket=accept(listenSocket,NULL,NULL);
if (connectSocket==INVALID_SOCKET)
{
printf("解说错误\n");
nSocketErr = WSAGetLastError();
}
else
{
//有客户连接请求被成功接收
char buf[1024];
memset(buf,0,sizeof(char)*1024);
//接收客户端传来的数据
int n= recv(connectSocket,buf,1024,MSG_PEEK);
if(n>0)
printf("服务器已经接收%d个字符:%s",n,buf);
}
closesocket(listenSocket);
closesocket(connectSocket);
getchar();
return 0;
}
return nRetCode;
}
/*以代码上编译通过*/