socket通信,client显示send成功但是server收不到任何东西??

longzhuvc 2014-02-25 09:54:24
// client
//
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<winsock2.h>



int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient;
struct sockaddr_in saServer;
char Message[]="hellolkjhlkjhglkhiuoyioytytetywejhfglhjoiupoiulkjhkljhlkjh;lkhopiyuio";
//char Message = '1';



wVersionRequested = MAKEWORD(2,2);
ret = WSAStartup(wVersionRequested,&wsaData);

if(ret != 0)
{
printf("WSAStartup() failed!\n");
}
else
printf("WSAStarup() success!\n");

if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock version!\n");
}
else
printf("WinSock 2.2 available!\n");
//确认WinSock 版本

sClient = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); //创建socket 用TCP
if(sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed!\n");
}
else
printf("socket() success!\n");

saServer.sin_family = AF_INET;
saServer.sin_port = htons(8001);
saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.48");
//Server 地址信息

ret = connect(sClient,(struct sockaddr *)&saServer,sizeof(saServer)); //请求连接
if (ret == SOCKET_ERROR)
{
printf("connect() failed!\n");
closesocket(sClient);
WSACleanup();
}
else
printf("connected!\n");

ret = send(sClient,(char *)&Message,sizeof(Message),0); //发送数据
if (ret == SOCKET_ERROR)
printf("send() failed!\n");
else
printf("Message has been sent!\n");
printf("%s",Message);
char recvbuf[100];
recv(sClient,recvbuf,100,0);
printf("%s",recvbuf);
closesocket(sClient); //关socket
WSACleanup();
getchar();

return 0;
}



//server
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace SocketServer {
public partial class ServerForm:Form {

Socket Server = null;
Socket Client = null;

public ServerForm() {
InitializeComponent();
}

private void ServerForm_Load( object sender , EventArgs e ) {
Control.CheckForIllegalCrossThreadCalls = false;
Thread thread = new Thread( new ThreadStart( SocketListen ) );
thread.Start();
//SocketTimer.Start();
}

private void SocketListen() {
IPHostEntry IPList = Dns.GetHostByName( Dns.GetHostName() );
IPAddress IP = IPList.AddressList[0];
IPEndPoint ServerIP = new IPEndPoint( IP , 8001 );
Server = new Socket( AddressFamily.InterNetwork , SocketType.Stream , ProtocolType.Tcp );

Server.Bind( ServerIP );
Server.Listen( 10 );

while ( true ) {
Client = Server.Accept();
while ( !Client.Poll( 10 , SelectMode.SelectRead )) {
MessageBox.Show("connetcted");
try {
string str = MessageTextBox.Text.Trim() + "\r\n";

//str += "客户端:" + Client.RemoteEndPoint.ToString() + " 连入!\r\n";
//MessageTextBox.Text = str;

// 准备读取客户端请求的数据,读取的数据将保存在一个数组中
byte[] buffer = new byte[4096];
// 接受数据
int length = Client.Receive( buffer , 4096 , SocketFlags.None );
if (length > 0)
{
MessageBox.Show("Hello");
}
// 将请求的数据翻译为 UTF-8
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
string requestString = utf8.GetString( buffer , 0 , length );

requestString = requestString + "\r\n";
str = requestString + str;

MessageTextBox.Text = str;
MessageTextBox.ScrollToCaret();
//向客户端返回一个值
Client.Send( Encoding.ASCII.GetBytes("Yes") );
} catch ( Exception ) {

}
}
}
}

private void MessageTextBox_TextChanged(object sender, EventArgs e)
{

}
}
}
...全文
1065 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
版主大哥 2014-02-26
  • 打赏
  • 举报
回复
server 好像不是c/c++
luobinshan 2014-02-26
  • 打赏
  • 举报
回复
请注意成功地完成send()调用并不意味着数据传送到达。 5.1.19 send() 简述: 向一个已连接的套接口发送数据。 #include <winsock.h> int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags); s:一个用于标识已连接套接口的描述字。 buf:包含待发送数据的缓冲区。 len:缓冲区中数据的长度。 flags:调用执行方式。 注释: send()适用于已连接的数据报或流式套接口发送数据。对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。 请注意成功地完成send()调用并不意味着数据传送到达。 如果传送系统的缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则send()将阻塞。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓冲区大小。可用select()调用来确定何时能够进一步发送数据。 在相关套接口的选项之上,还可通过标志位flag来影响函数的执行方式。也就是说,本函数的语义既取决于套接口的选项也取决于标志位。后者由以下一些值组成: 值 意义 MSG_DONTROUTE 指明数据不选径。一个WINDOWS套接口供应商可以忽略此标志;参见2.4节中关于SO_DONTROUTE的讨论。 MSG_OOB 发送带外数据(仅适用于SO_STREAM;参见2.2.3节)。 返回值: 若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。 错误代码: WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。 WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。 WSAEACESS:要求地址为广播地址,但相关标志未能正确设置。 WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。 WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 WSAEFAULT:buf参数不在用户地址空间中的有效位置。 WSAENETRESET:由于WINDOWS套接口实现放弃了连接,故该连接必需被复位。 WSAENOBUFS:WINDOWS套接口实现报告一个缓冲区死锁。 WSAENOTCONN:套接口未被连接。 WSAENOTSOCK:描述字不是一个套接口。 WSAEOPNOTSUPP:已设置了MSG_OOB,但套接口非SOCK_STREAM类型。 WSAESHUTDOWN:套接口已被关闭。一个套接口以1或2的how参数调用shutdown()关闭后,无法再用sned()函数。 WSAEWOULDBLOCK: WSAEMSGSIZE:套接口为SOCK_DGRAM类型,且数据报大于WINDOWS套接口实现所支持的最大值。 WSAEINVAL:套接口未用bind()捆绑。 WSAECONNABORTED:由于超时或其他原因引起虚电路的中断。 WSAECONNRESET:虚电路被远端复位。
赵4老师 2014-02-25
  • 打赏
  • 举报
回复
请先学会使用抓包软件比如wireshark
longzhuvc 2014-02-25
  • 打赏
  • 举报
回复
没人吗??。。。。。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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