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~。
- socket编程小记
- socket网络编程基础小记
- Java网络(Socket)编程小记一 UDP编程
- Java网络(Socket)编程小记二 TCP编程
- 编程小记
- 编程小记
- 编程小记
- Socket代理转发小记
- Socket代理转发小记
- 网络小记:SOCKET
- web,socket小记
- c# Socket 开发小记
- IPC小记 Socket
- python socket 数据传输小记
- shell编程小记
- C编程 知识点 小记
- 驱动编程小记
- 嵌入式 编程错误小记
- linux下安装Oracle10g RAC操作--根据[三思笔记]操作
- ubuntu下jthread 和jrtplib的安装
- 举例分析Linux动态库和静态库
- 关于jsp页面对url特殊字符的处理(加码/解码)2013-5-2
- Prism
- socket编程小记
- uva11462 - Age Sort(年龄排序)
- Java关键字及其作用
- IOS开发(32)之iOS高效开发必备的10款Objective-C类库(转载)
- opencv之灰度图强角点检测
- OpenCv学习笔记(五)-数学形态学2(灰度级膨胀和腐蚀及c语言实现)
- Linux系统下查看目录大小
- mysql ip限制问题
- 文件权限