请教C++高手

chinaasianegro 2010-01-06 10:59:53
接收端
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,0),&wsadata);
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
char recv[100];
int len;
SOCKADDR_IN addr,client;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=inet_addr("192.168.1.10");
addr.sin_port=htons(8000);
bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
WSAEVENT hEvent=WSACreateEvent();
WSAEventSelect(s,hEvent,FD_READ);
while(1)
{
WSANETWORKEVENTS netWork;
WSAWaitForMultipleEvents(1,&hEvent,FALSE,WSA_INFINITE,FALSE);
WSAEnumNetworkEvents(s,hEvent,&netWork);
if(netWork.lNetworkEvents==FD_READ)
recvfrom(s,recv,100,0,(SOCKADDR*)&client,&len);
printf("%s\n",recv);
}
}


发送端
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,0),&wsadata);
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8000);
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.10");
sendto(sockClient,"how do you do",strlen("how do you do")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}


为何接收端收不到数据
...全文
191 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaa3105563 2010-01-09
  • 打赏
  • 举报
回复
丿
snowman52013 2010-01-09
  • 打赏
  • 举报
回复
lz的接收端好像没有listen,我有个简单的例子,lz不妨看看。

//服务端
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")

using namespace std;

int main()
{
WORD wdVersionRequired;
WSADATA wsaData;
int temp;

wdVersionRequired = MAKEWORD(2, 2);
temp = WSAStartup(wdVersionRequired, &wsaData);

//注意函数返回值,0表示正常
if (temp != 0)
{
return 0;
}
//创建SOCKET
SOCKET s;
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
cout << "创建失败";
return 0;
}

//绑定SOCKET
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);

temp = bind(s, (const sockaddr *)&service, sizeof(sockaddr));
if (temp != 0)
{
cout << "绑定失败";
return 0;
}

//监听SOCKET
temp = listen(s, 10);
if (temp != 0)
{
cout << "监听失败";
return 0;
}

//接受连接
char rbuf[32];
char sbuf[32]="我是服务端,这是我发送的。\n";
sockaddr sa;
int salen = sizeof(sockaddr);
SOCKET sClient;
cout<<"等待客户端连接\n";
while(1)
{
sClient = accept(s, &sa, &salen);
temp = recv(sClient, rbuf, sizeof(rbuf), 0);
cout<<rbuf;
if (temp != 0 && temp != SOCKET_ERROR)
{
send(sClient, sbuf, sizeof(sbuf), 0);
//cout << sbuf;
}
else
{
break;
}
}
WSACleanup();//释放

return 1;
}


//客户端
// C01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <windows.h>
#pragma comment(lib, "ws2_32")

#include <iostream>
using namespace std;

int main()
{
WORD wdVersionRequired;
WSADATA wsaData;

wdVersionRequired = MAKEWORD(2, 2);
WSAStartup(wdVersionRequired, &wsaData);


//创建一个socket
SOCKET s;
s = socket(AF_INET, SOCK_STREAM, 0);
if(s == SOCKET_ERROR )
{
cout<<"创建失败";
return 0;
}

//连接服务器
sockaddr_in clientServer;
memset(&clientServer, 0, sizeof(clientServer));
clientServer.sin_family = AF_INET;
clientServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
clientServer.sin_port = htons(27015);

if(connect(s, (const sockaddr*)&clientServer, sizeof(sockaddr))==SOCKET_ERROR)
{
cout<<"连接失败";
return 0;
}

char sbuf[32] = "你好,我是客户端!\n";
char rbuf[32];
send(s, sbuf, sizeof(sbuf), 0);
recv(s, rbuf, sizeof(rbuf), 0);
//cout << sbuf;
cout << rbuf;
WSACleanup();
return 1;
}


梦之安魂曲 2010-01-07
  • 打赏
  • 举报
回复
以上程序是全双工发送的。LZ看合适不。
梦之安魂曲 2010-01-07
  • 打赏
  • 举报
回复
服务器端程序:
#include<iostream>
#include<windows.h>
#include<string.h>
using namespace std;

bool isexit=false;
DWORD WINAPI Send(LPVOID lparam)
{
char buffer[100];
SOCKET *socksend=(SOCKET*)lparam;
cin.getline(buffer,100,'\n');
while(true)
{
if(isexit)
break;

send(*socksend,buffer,strlen(buffer)+1,0);
cin.getline(buffer,100,'\n');
if(strcmp(buffer,"exit")==0)
{isexit=true;break;}


}
}
DWORD WINAPI Recv(LPVOID lparam)
{
char buffer[100];
SOCKET *sockrecv=(SOCKET*)lparam;
//recv(*sockrecv,buffer,100,0);
while(true)
{
recv(*sockrecv,buffer,100,0);
cout<<buffer<<endl;

if(strcmp(buffer,"exit")==0)
{isexit=true;break;}


}
}

HANDLE th[2];
int main(int argc,char *argv[])
{
WSADATA ws;
int ret=WSAStartup(MAKEWORD(2,1),&ws);
if(ret!=0)
{
cout<<"error happend"<<endl;
return 0;
}
SOCKET sockser;
SOCKET sockcli;
sockser=socket(AF_INET,SOCK_STREAM,0);
if(sockser==INVALID_SOCKET)
{
MessageBoxA(NULL,"error accept","error",MB_OK);
return 0;
}
sockaddr_in address;
address.sin_family=AF_INET;
address.sin_addr.S_un.S_addr=INADDR_ANY;
address.sin_port=htons(1234);
bind(sockser,(sockaddr*)&address,sizeof(sockaddr));
listen(sockser,5);
sockcli=accept(sockser,NULL,NULL);
MessageBoxA(NULL,"success accept","error",MB_OK);
if(sockcli==INVALID_SOCKET)
{
MessageBoxA(NULL,"error accept","error",MB_OK);
return 0;
}
th[0]=CreateThread(NULL,0,Send,(void*)&sockcli,0,NULL);
th[1]=CreateThread(NULL,0,Recv,(void*)&sockcli,0,NULL);
WaitForMultipleObjects(2,th,true,INFINITE);
CloseHandle(th[0]);
CloseHandle(th[1]);
closesocket(sockser);
closesocket(sockcli);
WSACleanup();
system("pause");
return 0;
}


客户端程序:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <string.h>
using namespace std;
bool isexit=false;
DWORD WINAPI Send(LPVOID lparam)
{
SOCKET *sock=(SOCKET*)lparam;
char buffer[100];
while(true)
{
if(isexit)
break;

cin.getline(buffer,100,'\n');
send(*sock,buffer,strlen(buffer)+1,0);
if(strcmp(buffer,"exit")==0)
{ isexit=true;break;}

}

//closesocket(*sock);
}
DWORD WINAPI Recv(LPVOID lparam)
{
SOCKET *sock=(SOCKET*)lparam;
char buffer[100];

while(true)
{
if(isexit)
break;
recv(*sock,buffer,100,0);
if(strcmp(buffer,"exit")==0)
{isexit=true;break;}
cout<<buffer<<endl;




}

//closesocket(*sock);
}
HANDLE th[2];
int main(int argc, char *argv[])
{

WSADATA ws;
int ret=WSAStartup(MAKEWORD(2,1),&ws);
if(ret!=0)
{
cout<<"error happend"<<endl;
return 0;
}
SOCKET sock;
sockaddr_in address;
address.sin_family=AF_INET;

cout<<"please input the address of server:"<<endl;
char array[40];
memset(array,0,40);
cin>>array;
address.sin_addr.S_un.S_addr=inet_addr(array);
address.sin_port=htons(1234);
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
{
MessageBoxA(NULL,"error accept","error",MB_OK);
return 0;
}
//bind(sock,(sockaddr*)&address,sizeof(sockaddr));
connect(sock,(sockaddr*)&address,sizeof(sockaddr));
MessageBoxA(NULL,"success connected","error",MB_OK);
th[0]=CreateThread(NULL,0,Send,(void*)&sock,0,NULL);
th[1]=CreateThread(NULL,0,Recv,(void*)&sock,0,NULL);
WaitForMultipleObjects(2,th,true,INFINITE);
CloseHandle(th[0]);
CloseHandle(th[1]);
closesocket(sock);

WSACleanup();
system("PAUSE");
return EXIT_SUCCESS;
}
macrojj 2010-01-07
  • 打赏
  • 举报
回复
行了不
lori227 2010-01-07
  • 打赏
  • 举报
回复
最好是用MAKEWORD(2,2)初始化网络环境

服务器地址 addr.sin_addr.S_un.S_addr = INADDR_ANY

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧