基于TCP的socket编程

基于TCP的socket编程
基于TCP的socket编程

基于TCP的socket编程

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM)TCP,数据报套接字UDP (SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。

在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

以下是服务器端代码如下(VC项目应建立在windows控制台模式下的应用程序):

#include

#include

void main()

{

WORD wVersionRequested; //版本号

WSADATA wsaData; //启动SOCKET的

int err;

wVersionRequested = MAKEWORD( 1, 1 );//建立版本

err = WSAStartup( wVersionRequested, &wsaData );//启用socket

if ( err != 0 ) //如果返回值不等于0,那么表示出错,直截退出程序

{

return;

}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //设置为TCP流模式SOCKADDR_IN addrSrv; //

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //INADDR_ANY为本机任意IP

addrSrv.sin_family=AF_INET; //

addrSrv.sin_port=htons(6000); //侦听端口为6000 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定到SOCKET

listen(sockSrv, 5); //侦听sockSrv,并设置最大客户连接数为5。SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

{

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //等待客户连接,如果没有客户连接时,则此函数在这里会产生阻塞。

char sendBuf[50];

sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送sendBuf的字符串给客户端。char recvBuf[50];

recv(sockConn,recvBuf,50,0); //从客户端接收50个字节。printf("%s\n",recvBuf); //显示客户端发过来的字符串closesocket(sockConn); //关闭字

}

WSACleanup(); //清理

}

很简单吧?呵呵。再复杂的使用TCP协议的网络通信程序也是基于此的。下面顺便也把客户端的程序写出来。相同部分的程序就不不注释了。

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端的代码如下:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置SOCKET的IP为本机。addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);//端口为6000,服务端和客户端的端口一定要相同.否则是连

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//根据addrSrv连接服务端

char recvBuf[50];

recv(sockClient,recvBuf,50,0); //接收50字符

printf("%s\n",recvBuf); //显示

send(sockClient,"hello",strlen("hello")+1,0); //发送一个hello

closesocket(sockClient); //关闭

WSACleanup(); //清理

}

对了,在这种模式叫做什么同步阻塞模式,遇到连接,发送,接受函数时,程序便会等待,直到完成操作,才会执行下面的程序段,所以一般这些网络操作都会开启一个新线程去完成,那样不会使程序的主线程阻塞。

windows socket 编程实例--TCP

客户端向服务器发信息, 收到后打印一下,再回发. 客户端收到信息后打印.【来自网络】

---------------这是服务器的-------------------

#include "afxmt.h"

#include "winsock2.h"

#pragma comment(lib,"WS2_32.LIB")

int bufi;

class mserver{

private:

SOCKET ssock,csock;

sockaddr_in saddr,caddr;

int len;

char buf[4096];

public:

mserver(){

}

mserver(int port,int maxclient){

saddr.sin_family=AF_INET;

saddr.sin_port=htons(port);

saddr.sin_addr.s_addr=INADDR_ANY;

ssock=socket(AF_INET,SOCK_STREAM,0);

if(ssock==INVALID_SOCKET){

printf("build socket error\n");

}

if(bind(ssock,(struct sockaddr*)&saddr,sizeof(saddr))==SOCKET_ERROR){ printf("socket bind fail\n");

}

len=sizeof(caddr);

}

void close(){

closesocket(ssock);

closesocket(csock);

}

void beginlisten(){

if(listen(ssock,10)==SOCKET_ERROR){

printf("listen fail\n");

}

}

void maccept(){

sockaddr a;

csock=accept(ssock,(struct sockaddr*)&caddr,&len);

if(csock==INVALID_SOCKET){

printf("accept fail : %d\n",WSAGetLastError());

}

printf("client from %s connected\n",inet_ntoa(caddr.sin_addr));

}

int receive(){

memset(buf,0,4096);

if(recv(csock,buf,4096,0)==SOCKET_ERROR){

return 0;

}

printf("message received : %s\n",buf);

send(csock,buf,4096,0);

return 1;

}

};

int main()

{

WSADATA wsaData;

if (WSAStartup(MAKEWORD(2,1),&wsaData)){

printf("Winsock initializing fail\n");

WSACleanup();

return 0;

}

mserver s(12345,10);

s.beginlisten();

s.maccept();

while(s.receive());

s.close();

WSACleanup();

return 0;

}

----------------这是客户端的-------------------

#include "stdio.h"

#include "afxmt.h"

#include "winsock2.h"

#pragma comment(lib,"WS2_32.LIB")

class mclient{

private:

SOCKET sock;

sockaddr_in saddr;

int len;

char buf[4096];

public:

mclient(){

sock=socket(AF_INET,SOCK_STREAM,0);

len=sizeof(saddr);

}

bool mconnect(char* addr,int port){

saddr.sin_family=AF_INET;

saddr.sin_port=htons(port);

saddr.sin_addr.s_addr=inet_addr(addr);

if(connect(sock,(struct sockaddr*)&saddr,len)==SOCKET_ERROR){ printf("connect fail : %d",WSAGetLastError());

return false;

}

return true;

}

void close(){

closesocket(sock);

}

void msend(char* mes){

send(sock,mes,strlen(mes),0);

}

bool receive(){

memset(buf,0,4096);

if(recv(sock,buf,4096,0)==SOCKET_ERROR){

return false;

}

else{

printf("received from server : %s\n",buf);

return true;

}

}

};

int main()

{

WSADATA wsaData;

if (WSAStartup(MAKEWORD(2,1),&wsaData)){ printf("Winsock initializing fail\n");

WSACleanup();

return 0;

}

mclient a;

if(!a.mconnect("172.18.48.7",12345)){

return 0;

}

char buf[1024];

while(scanf("%s",buf)){

if(strcmp(buf,"quit")==0){

break;

}

a.msend(buf);

a.receive();

}

a.close();

WSACleanup();

return 0;

}

socket 编程——tcp简单实例

//服务器端代码

#include

#include

#pragma comment(lib,"ws2_32.lib")

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1,1);

err = WSAStartup(wVersionRequested,&wsaData);

if(err != 0)

{

return ;

}

if(LOBYTE( wsaData.wVersion)!=1 ||

HIBYTE( wsaData.wVersion )!=1)

{

return;

}

SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrServer;

addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

addrServer.sin_family = AF_INET;

addrServer.sin_port = htons(5555);

::bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));

listen(sockServer,5);

SOCKADDR_IN addrClient;

int len = sizeof(SOCKADDR);

while(1)

{

SOCKET sockConn = accept(sockServer,(SOCKADDR*)&addrClient,&len); char sendBuf[100];

sprintf(sendBuf,"Welcom %s to here!",inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf[100];

recv(sockConn,recvBuf,100,0);

printf("Client say: %s\n",recvBuf);

closesocket(sockConn);

}

}

//客户端代码,

#include

#include

#pragma comment(lib,"ws2_32.lib")

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1,1);

err = WSAStartup(wVersionRequested,&wsaData);

if(err != 0){

return ;

}

if(LOBYTE( wsaData.wVersion) !=1 ||

HIBYTE( wsaData.wVersion ) !=1)

{

WSACleanup();

return;

}

SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrServer;

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

addrServer.sin_family = AF_INET;

addrServer.sin_port = htons(5555);

connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); send(sockClient,"hello",strlen("hello")+1,0);

char recvBuf[100];

//sprintf(recvBuf,0,100);

recv(sockClient,recvBuf,100,0);

printf("%s\n",recvBuf);

closesocket(sockClient);

WSACleanup();

}

相关主题
相关文档
最新文档