socket套接字,如何发送一个结构体?
例如:structData{intsize;char*pBuf;//大小未知};DatasendData;send(s,&sendData,......);将近一年了,改...
例如:
struct Data{
int size;
char *pBuf;//大小未知
};
Data sendData;
send(s,&sendData, ......);
将近一年了,改问题依旧没人正确回答,然而今天的我经过翻阅各种开源库已经有了答案。就在这里与大家一起分享吧。
很简单,结构体这样定义:
struct Data{
int size;
char buf[0];//大小未知
};
有人可能会觉得,咦。。。怎么buf的大小为0?没错,我没有写错,你写没有看错,就是0。其实这里主要是让buf的地址紧接着结构的地址。那该怎么用呢?比如你要buf是1024字节,那么:
int size = sizeof(Data) + 1024;
Data *data = (Data *)malloc(size);
用的时候就把buf当1024个字节用。
这里还要注意结构体的大小,内存对齐问题。讨论更多可以加群:184284134 展开
struct Data{
int size;
char *pBuf;//大小未知
};
Data sendData;
send(s,&sendData, ......);
将近一年了,改问题依旧没人正确回答,然而今天的我经过翻阅各种开源库已经有了答案。就在这里与大家一起分享吧。
很简单,结构体这样定义:
struct Data{
int size;
char buf[0];//大小未知
};
有人可能会觉得,咦。。。怎么buf的大小为0?没错,我没有写错,你写没有看错,就是0。其实这里主要是让buf的地址紧接着结构的地址。那该怎么用呢?比如你要buf是1024字节,那么:
int size = sizeof(Data) + 1024;
Data *data = (Data *)malloc(size);
用的时候就把buf当1024个字节用。
这里还要注意结构体的大小,内存对齐问题。讨论更多可以加群:184284134 展开
1个回答
2016-11-30
展开全部
1.TCP流式套接字的编程步骤
在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
客户端代码如下:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
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);创建套接字(socket)。
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(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。
在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
客户端代码如下:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
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);创建套接字(socket)。
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(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。
追问
大哥看问题啊。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询