SOCKET accept( SOCKET s, struct sockaddr FAR*addr, int FAR *addrlen); //最后一个参数一定要赋值为 SOCKADDR结构体的长度 否则调用失败 这个MSDN的解释有
SOCKET是网络编程的接口 目前的C/S模式的开发都是基于 SOCKET 的
TCP服务器编写流程 :
创建socket----------->配置SOCKADDR_IN 并调用bind()函数绑定到socket----------->监听套接字调用listen()函数--------->调用accept()函数等待连接到来并且返回用于通信的socket----------------- ->双方通信 ----------------->通信结束closesocket
TCP 客户端编写流程 :
创建socket----------->配置SOCKADDR_IN (服务器端信息)------->connect连接到服务器端 ------>用本地创建的套接字进行通信 -------->通信结束 closesocket
1. 我这里将服务器端封装了一个 SocketSrv类 先启动服务端后启动客户端
/*
面向对象的套接字编程 服务端
基于TCP协议
*/
#include <iostream>
#include "winsock.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std ;
class SocketSrv
{
public :
BOOL InitSocketLibrary() //初始化套接字库
{
WSADATA wsa ;
if(WSAStartup(MAKEWORD(1,1),&wsa) )
return FALSE ;
return TRUE ;
}
void CreateSocket()
{
m_socket=::socket(AF_INET,SOCK_STREAM,0) ; //创建一个套接字
}
BOOL Bind(int port) //绑定端口
{
SOCKADDR_IN addr ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(port);
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //绑定本地网卡的任何IP
if(SOCKET_ERROR==::bind(m_socket,(SOCKADDR*)&addr,sizeof(SOCKADDR)))
return FALSE ;
return TRUE ;
}
void Listen()
{
::listen(m_socket,5) ; //最大连接5 监听端口
}
void Accept()
{
this->len=sizeof(SOCKADDR) ;
tem=::accept(m_socket,(SOCKADDR*)&addr,&len) ;
}
~SocketSrv()
{
::closesocket(m_socket) ;//关闭套接字
}
void CloseTemSocket()
{
::closesocket(tem) ;
}
void Recv(char *buf,int sizeofbuf)
{
recv(tem,buf,sizeofbuf,0) ;
}
void Send(char *sendbuf,int length)
{
send(tem,sendbuf,length,0) ;
}
SOCKET m_socket ;
SOCKET tem ;
SOCKADDR_IN addr;
int len;
};
void main()
{
SocketSrv sock;
sock.InitSocketLibrary() ;
sock.CreateSocket() ;
sock.Bind(9999) ;
sock.Listen() ;
cout<<"服务器启动成功:"<<endl ;
sock.Accept() ;
char buf[100] ;
char senddata[]="recvived data" ;
sock.Recv(buf,100) ;
cout<<"recv date :"<<buf<<endl ;
sock.Send(senddata,strlen(senddata)+1) ;
sock.CloseTemSocket() ;//关闭用于临时通话的 socket
}
2.
/*
客户端 TCP SockerSrv 我们自己写的类来实现 网络编程
*/
#include <iostream>
#include "winsock.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std ;
void main()
{
::WSADATA wsa ;
::WSAStartup(MAKEWORD(1,1),&wsa) ;
SOCKET s=::socket(AF_INET,SOCK_STREAM,0) ;
SOCKADDR_IN addr ;
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1") ; //将服务器地址转换为网络字节序 的ULONG类型
addr.sin_family=AF_INET;
addr.sin_port=htons(9999) ; //将端口转换为网路字节序 也就是高位先存 在计算机中一般是是 低位先存
::connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
char buf[]="hello !" ;
char recvbuf[100] ;
send(s,buf,strlen(buf)+1,0) ;
recv(s,recvbuf,100,0) ;
cout<<"服务器说:"<<recvbuf <<endl ;
}