socket编程小记

来源:互联网 发布:边锋游戏大厅mac 编辑:程序博客网 时间:2024/06/05 09:23

网络编程课上学习了一些socket函数,在C语言下和MFC下小结一下:

 

首先socket的五元组有<源IP,目标IP,源端口,目的端口,协议>


总的来说socket分为几个步骤,对于客户端:

1.      初始化

2.      创建socket结构,填充如TCP/UDP类型,IPv4结构等

3.      创建目标IP的地址,目的端口信息结构,然后进行连接Connect();

(客户端自己如果对端口没有要求可以不用bind一个固定端口,但也可以通过Connect函数返回后得到自己实际使用的是哪一个端口)

4.      连接建立

 也就是对于客户端,简单的只要初始化<目标IP,目的端口,协议>就行了

//初始化

WSADATA WSAData;

WSAStartup(0x0202,&WSAData);

  

 //创建socket结构 可能失败

mCon=socket(AF_INET,SOCK_STREAM,0);

 

/*e.g  SOCKADDR_IN  ServerAddr;

   charbuffer[20]=”127.0.0.1”;

 创建目标的信息

*/

ServerAddr.sin_family                             =PF_INET;             

ServerAddr.sin_port                                =htons(1088);         //目的端口

ServerAddr.sin_addr.S_un.S_addr     =inet_addr(buffer);  //目的地址

 

//进行连接 需要判断是否成功

if(connect(mCon,(sockaddr*)&ServerAddr,sizeof(ServerAddr))!=SOCKET_ERROR)

进行相应的send/recv工作….


格式问题:1.SOCKADDR_IN结构是windows中对于sockaddr类型的重写,两者的大小是相同的这样可以更好的对ip地址的每一位进行操作

struct sockaddr{

u_short sa_family;

char sa_data[14];

};

struct sockaddr_in{

Short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

2.htons()用于将一个我们常见的端口如80,转化为一个short类型端口,实际网络中传递的都是这个short值 也可记为host-to-net

  ntohs()功能刚好相反,用于将short类型的端口转化为主机端口net-to-host

3.inet_addr()用于将一个char类型的字符串(以0结尾),转化为一个无符号长整型

 

对于服务端,进行的工作与之差不多,只是服务端需要指明自己开放的是哪一个端口和ip,需要用bind函数

1.初始化

2.创建socket结构,填充如TCP/UDP类型,IPv4结构等

3.创建自己IP的地址,端口信息,绑定本机

4.监听是否有连接

5.接受连接请求

 

//初始化

WSADATA WSAData;

         WSAStartup(0x0202,&WSAData);

//创建socket结构

s=socket(AF_INET,SOCK_STREAM,0);

 

//SOCKADDR_IN                     con;

con.sin_addr.S_un.S_addr           =inet_addr("127.0.0.1");

con.sin_port                                     =htons(1088);

con.sin_family                                =PF_INET;

 

//绑定本机可能会失败,如端口被占用等错误

bind(s,(constsockaddr*)&con,sizeof(SOCKADDR_IN))!=NO_ERROR

 

//监听是否有请求,第二个参数用来表示最大允许多少个用户登陆

listen(s,5);

//接受这个请求,对应的那个客户端的connect函数返回成功

acflag=accept(s,(sockaddr*)&tcpcon,&i);

进行相应的send/recv工作….

 

在做客户端的时候因为往往要涉及到界面的编写,所以相互之间的数据转换比较麻烦,以MFC为例发送http,其也提供了一个类似的函数。

//建立网络发出请求

CInternetSession MyConnect("MFC ",1,INTERNET_OPEN_TYPE_DIRECT);

CHttpConnection* pServer= NULL;

CHttpFile* pHttpFile=NULL;

INTERNET_PORT nPort;

 

/*AfxParseURL解析一个如下形式的URL:service://server/dir/dir/object.ext:port,返回的内容如下:

           strServer == "server"

           strObject == "/dir/dir/object/object.ext"

           nPort == #port

           dwServiceType == #service

http默认是80端口

   从输入的网址中可以解析出包含目标地址的网址和端口号

*/

AfxParseURL(URL,dwServiceType,strServer,strObject,nPort);

             

//建立连接 对应于socket中的Connect函数

pServer=MyConnect.GetHttpConnection(strServer,nPort);

 

//构造相应的http报文,实际上类似于send函数,只不过对具体内容进行了封装

//打开这个连接,构造http报头

pHttpFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,

           strObject, NULL,1, NULL, NULL);

 

pHttpFile->AddRequestHeaders(_T("Accept: */*\r\nUser-Agent:MFC\r\n"));

    //发送GET请求

pHttpFile->SendRequest();

 

//等待请求是否有回应StatusCode为返回码,表示http连接是否成功

    DWORD StatusCode;

pHttpFile->QueryInfoStatusCode(StatusCode);

 

 

以上内容均为一个大概的框架,具体函数功能及参数请参阅相关文档O(∩_∩)O~。

原创粉丝点击