还是直入主题,学会了基础的S - C 链接
1.Server端
WSADATA wsaData;
//(1)初始化Socket库
WSAStartup(MAKEWORD(2,0),&wsaData);
//(2)创建一根电线,即初始化socket结构
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//(3)设置绑定端口
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
//设置连接客户端的监听端口
sa.sin_port = htons(1500);
//主机监听的ip地址
sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
(4)绑定端口
if(bind(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
{
//ShowError();//这个函数是自己定义的,这里是用来显示绑定后错误的,因为链接常常会发生错误,需要收集这些错误;
break;
}
//(5)开始监听该端口,前一个是初始化好的socket,后一个是支持的最大连接数
listen(sock, 2);
//新的地址信息和新的套接字(socket),马上要用到。
SOCKADDR nsa;
SOCKET nsocket;
// 用于满足accept函数的最后一个参数
int addlen = sizeof(SOCKADDR);
//(6)接受链接,这里说明一下,程序运行到listen函数后,就暂停了,直到有程序请求链接,才会运行到这一步
nsocket = accept(sock, &nsa, &addlen);
//至此,程序就可以调用send 和 recv函数来收发数据了。
2.客户端Client
客户端的编写相对简单,前面与服务端类似。
WSADATA wsaData;
//(1)初始化Socket库
WSAStartup(MAKEWORD(2,0),&wsaData);
//(2)初始化socket结构
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
//(3)设置电线连接服务器端的端口
sa.sin_port = htons(1500);
//(4)设置服务器IP 地址
sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//(5)链接服务器
if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
{
ShowError();//同上
break;
}
//至此,也可以开始收发信息了。
3.收发信息
大致提一下send 和 recv,
int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
s:一个用于标识已连接套接口的描述字。
buf:包含待发送数据的缓冲区。
len:缓冲区中数据的长度。
flags:调用执行方式。
标志位可取下列值: (一般取0)
值 意义
MSG_DONTROUTE 指明数据不选径。
MSG_OOB 处理带外数据。
int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
s:一个标识已连接套接口的描述字。
buf:用于接收数据的缓冲区。
len:缓冲区长度。
flags:指定调用方式。
标志位可取下列值:(一般取0)
值 意义
MSG_PEEK查看当前数据。数据将被复制到缓冲区中,但并不从输入队列中删除。
MSG_OOB 处理带外数据。
这两个函数调用后产生的错误需要调用WSAGetLastError()或者GetLastError()获取相应错误代码。