您的位置:首页 > 其它

说说关于我这两天对socket的理解

2013-08-05 23:29 225 查看
  本人新手一枚,在c++的路上走了也有一年半载了,但由于各种各样的原因,总是断断续续的去学学。这两天刚刚学习了socket相关的编程,特写这份笔记来加深我自己的记忆,以及看看自己能不能把学到的东西再现出来。

  首先我们要使用WSAStartup()来进行socket的初始化,其中WSAStartup有两个参数,一般WSAStartup(2,0)这样去调用即可。

  然后就到创建socket套接字的步骤,socket函数有三个参数,首先第一个是int af,因为我们要进行的是网络间的通信,所以我们要选择AF_INET,而关于在windows本地进行的通信该怎么写,还有待研究。第二个int type,要进行流套接字通信的要写SOCK_STREAM,数据报套接字的则是选用SOCK_DGRAM,一般我们现在使用的都是SOCK_STREAM了。第三个int protocol一般是取0,表示tcp/ip协议。

  创建好套接字之后,要做的就是把套接字与本地的地址绑定起来了,其中绑定的函数是bind,其包含三个参数SOCKET s,(sockaddr*)&sockaddr_in,sizeof(sockaddr_in)。其中sockaddr是用sockadd_in这个结构体创建出来的结构的地址强制转换过来的,我们首先要用sockaddr_in这个结构体来进行对本机地址的定义,其中sockaddr_in.sin_family = AF_INET,sockaddr_in.sin_port = 约定的端口号,sockaddr_in.sin_addr.S_un.S_addr=inet_addr("要放的ip")/进行转换,该函数将一个点分十进制ip地址转换成一个长整型的数,设置好以后就可以运用bind函数对端口号和本机的ip地址进行绑定了!bind(socket s,(sockaddr*)&sockaddr_in,sizeof(sockaddr_in));运行成功后会返回0,假若是客户端s就是已经可以使用的了。

  这里面最为重要的是搞清楚sockaddr_in这个结构的作用,我查了不少资料,耗了不少时间才搞好了ip地址这一点点功能,要熟练起来,还要继续深究一下。

  至于服务端还要要另外加listen() 和 accept()两个函数才能够进行服务,这个我下次再写写。

  附上今天写的客户端的一点点代码(有点凌乱,使用vs2012来练习写的):

// prctise2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <cstring>
#pragma comment(lib,"ws2_32")
#define SERVERPORT 3333
#define MAXDATASIZE 100

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if((WSAStartup(MAKEWORD(2,0),&wsaData))==0){
printf("初始化成功!\n");}
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
if(s!=INVALID_SOCKET){printf("套接字创建成功!\n");}
//获取服务器主机信息

//准备服务器的信息
sockaddr_in s1_addr;
s1_addr.sin_family=AF_INET;
s1_addr.sin_addr.S_un.S_addr=inet_addr("192.168.19.101");
s1_addr.sin_port=htons(SERVERPORT);
int ret=connect(s,(sockaddr*)&s1_addr,sizeof(s1_addr));
if(ret != SOCKET_ERROR){printf("连接成功!\n");}

//发送数据
char buf[50];
string str;
int i=0,ii=0x10;
while(i!=ii){printf("%d\n",i);i++;}
while(1){
cin >> buf;
printf("%d.输入完毕!正在发送···\n",i);
send(s,buf,50,0);
Sleep(500);
i++;
}
//关闭套接字
shutdown(s,SD_BOTH);
closesocket(s);
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: