孙鑫 第十四课Socket编程之二 函数

来源:互联网 发布:淘宝页头装修素材 编辑:程序博客网 时间:2024/05/14 23:53

本文介绍Socket编程中用到的函数

 

①WSAStartup()

int WSAStartup(

WORD     wVersionRequested,  //请求的版本,可由函数MAKEWORD生成

 LPWSADATA     lpWSAData  //[out], 函数返回后该结构体包含和Socket相关的一些参数信息

);

该函数成功返回0,否则可用 int   WSAGetLastError(void)取得错误代码。

eg.

wVersionRequested = MAKEWORD(2, 0);  //请求的版本号为2.0版

WSADATA   wsaData;

if( 0!= WSAStartup(wVersionRequsted, &wsaData) )

{

    cerr<<"startup error!"<<endl;

}

 

②LOBYTE /  HIBYTE

BYTE LOBYTE(

WORD wValue

);

BYTE HIBYTE(

WORD   wValue

);

函数功能:取得WORD类型变量的低字节 / 高字节

eg.

if( LOBYTE(wsaData.wVersion) != 2  ||  HIBYTE(wsaData.wVersion) != 0 )

{

    cerr<<"version error"<<endl;

}

 

③socket

SOCKET socket( 

int    af,  //必须为AF_INET

int    type,  //TCP为SOCK_STREAM,  UDP为SOCK_DGRAM

int     protocol  //协议,一般为0,自动找合适的协议

);

函数功能:建立套接字

eg.

SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);

 

④inet_addr / inet_ntoa

unsigned long inet_addr(

const char FAR* cp //点分十进制的IP地址

);

函数功能:把点分十进制的IP地址转化为网络字节序的IP地址

eg.

char *ip = "222.151.124.35";

inet_addr(ip);


char FAR* inet_ntoa(

struct in_addr  in //包含IP地址的结构体变量,是SOCKADDR_IN结构体中的一个成员,具体见⑥bind中的介绍

);

函数功能:从一个strcut in_addr结构体中获得字符串类型的点分十进制IP地址

eg.

SOCKADDR_IN  addr_client; //假设该变量已经被赋值

char *ip = inet_ntoa(addr_client.sin_addr);


⑤htos / htonl / ntohs / ntohl

h:host, n:net, s:short, l:long


u_short htons(

u_short  hostshort

);//u_short类型主机字节序地址转化为u_short类型网络字节序地址


u_long  htonl(

u_long  hostlong

);//u_long类型主机字节序地址转化为u_long类型网络字节序地址


u_short ntohs(

u_short  netshort

);//u_short类型网络字节序地址转化为u_short类型主机字节序地址


u_long ntohl(

u_long  netlong

);//u_long类型网络字节序地址转化为u_long类型主机字节序地址



⑥bind

int bind(

SOCKET   s,  //本socket(服务器端或客户端)

const struct sockaddr FAR *   name,  //  [in]绑定的地址端口结构体指针

int    namelen   //[in] 一般大小为sizeof(SOCKADDR)

);

函数功能:绑定套接字到指定的本地地址/端口

函数中的第二个参数sockaddr型结构体也可以写成大小的SOCKADDR,同时还有一个类似的结构体SOCKADDR_IN更加方便使用,

struct sockaddr_in{   

short sin_family;     //地址族, 必须是AF_INET

unsigned short sin_port;   //端口,指定端口时必须转换为网络字节序: htons(端口号); 

struct   in_addr sin_addr;    //IP地址在此结构体中

char sin_zero[8];  //仅占位用

}; 

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_longS_addr; //IP地址,需要网络字节序

} S_un; 

#define  s_addr     S_un.S_addr

#define s_host      S_un.S_un_b.s_b2

#define s_net        S_un.S_un_b.s_b1

#define s_imp        S_un.S_un_w.s_w2

#define s_impno    S_un.S_un_b.s_b4

#define s_lh           S_un.S_un_b.s_b3

};

eg.

SOCKADDR_IN  addr_server;

char* ip = "127.0.0.1";

sockServer.sin_addr.S_un.S_addr = inet_addr(ip);

//上句也可以为 sockServer.sin_addr.s_addr = inet_addr(ip);

sockServer.sin_family = AF_INET;

sockServer.sin_port = htons(6000);

bind(sockServer, (SOCKADDR*) &addr_server, sizeof(SOCKADDR));

 

⑦listen

int listen( 

SOCKET   s,//本socket, 一般是TCP的服务器端

int   backlog //请求队列中的最大客户端数,可以设置为SOMAXCONN

);

eg.

listen(sockServer, 5);

 

⑧accept 

SOCKET accept( 

SOCKET    s,  //本socket 一般为TCP服务器端

 struct sockaddr FAR*   addr,  //[out],用来保存连接的客户端地址信息

 int FAR*   addrlen  //[in, out] 必须赋初值,  *addrlen初值一般为sizeof(SOCKADDR)

);

 函数功能:(TCP服务器端)程序执行到此时阻塞,一直在此等候连接,连接到达后返回一个连接套接字,之后服务器端用此连接套接字和客户端通信。

eg.

SOCKADDR_IN  addr_client;

int   len = sizeof(SOCKADDR);

SOCKET sockConn = accept(sockServer, (SOCKADDR*) &addr_client, &len);//程序在此阻塞,一直有连接到来

 

⑨connect

int  connect(

SOCKET s, //本socket,一般是TCP中客户端

const  struct sockaddr  FAR* name, //要连接的服务器地址结构体指针

int  namelen  //一般为sizeof(SOCKADDR)

);

函数功能:TCP中客户端向服务器发起连接请求

eg.

SOCKADDR_IN  addr_server;

addr_server.sin_addr.s_addr = inet_addr("127.0.0.1");

addr_server.sin_family = AF_INET;

addr_server.sin_port = inet_htons(6000);

connect(sockClient, (SOCKADDR*) &addr_server, sizeof(SOCKADDR));

 

⑩send /  sendto

TCP中用send,UDP中用sendto

int send(

SOCKET  s , //本socket

const char FAR * buf, //要发送的缓存指针

int len,//要发送的内容长度,单位字节

int  flags //为0即可

);

eg.

char sendBuffer[100] = "hello client!";

send(sockServer, sendBuffer, strlen(sendBuffer) + 1, 0);

 

int   sendto(

SOCKET s, //本socket

const char FAR*  buf,// 要发送的内容指针

int  len, //要发送的内容长度

int flags, //为0即可

const struct sockaddr  FAR* to, //目的地地址结构体(包括IP和端口)

int tolen //一般为sizeof(SOCKADDR)

);

eg.

char sendBuffer[100] = "hello server!";

SOCKADDR_IN     addr_server;

addr_server.sin_addr.s_addr = inet_addr("127.0.0.1");

addr_server.sin_family = AF_INET;

addr_server.sin_port = htons(6000);

sendto(sockClient, sendBuffer, strlen(sendBuffer) + 1, 0, (SOCKADDR*) &addr_server, sizeof(SOCKADDR));

 

?recv / recvfrom

TCP中用recv, UDP中用recvfrom

int  recv(

SOCKET s, //本socket

char  FAR*  buf, //内容接收到的缓冲区

int  len,  //接收len长度的内容

int  flags //为0即可

);

eg.

char recvBuffer[100];

memset(recvBuffer, '\0', sizeof(recvBuffer));

recv(sockServer, recvBuffer, sizeof(recvBuffer), 0);

 

int  recvfrom(

SOCKET s, //本socket

char  FAR* buf, //接受到此缓冲区

int  len, //接收len长度的内容

int  flags, //为0即可

struct sockaddr  FAR* from, //从此地址接收 

int FAR* fromlen // *fromlen初值一般为sizeof(SOCKADDR)

);

eg.

char recvBuffer[100];

memset(recvBuffer, '\0', sizeof(recvBuffer));

SOCKADDR_IN  addr_client;

addr_client.sin_addr.s_addr = inet_addr("222.195.158.17");

addr_client.sin_family = AF_INET;

addr_client.sin_port = htons(6000);

int  len = sizeof(SOCKADDR);

recvfrom(sockServer, recvBuffer, sizeof(recvBuffer), 0, (SOCKADDR*)&addr_client, &len);

 

 

未尽事宜,请上google上百度一下,本日志解释权归三鹿牛奶所有!

孙鑫 第十四课Socket编程之二  函数 - 大灰狼 - 大灰狼 的博客

 

 

原创粉丝点击