基于c++控制台的tcp通信源码
(2011-02-15 09:44:14)
标签:
tcp控制台杂谈 |
分类: 网络传输 |
网上看到的程序,觉得挺适用的,转载了。。。已经过验证,是可以正确运行的
服务器socket绑定一个端口,然后等待客户机的接入。
客户端socket去连服务器和一个特定端口,连接成功后即可进行通信,发送字符串。
客户端代码:
- #include
<iostream>
- #include
<string>
- #include
<winsock2.h>
- #pragma
comment(lib,"ws2_32.lib")
- using
namespace std; -
- int
main() - {
-
"客户端启动"<<endl;cout<< -
//初始化winsock -
WSADATA wsaD; -
WSAStartup(MAKEWORD(1,1),&wsaD); -
//创建客户端socket -
SOCKET sclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -
//连接服务器 -
structsockaddr_in servaddr; -
servaddr.sin_family=AF_INET; -
"10.0.70.37");servaddr.sin_addr.s_addr=inet_addr( //指定服务器 -
//指定端口servaddr.sin_port=htons(8080); -
"确实要建立连接? yes/no"<<endl;cout<< -
charflag[3]; -
gets(flag); -
if(strcmp(flag,"yes")==0) -
{ -
structconnect(sclient,( sockaddr*)&servaddr, sizeof(servaddr));//通过套接字连接主机 -
} -
-
//发送数据 -
charbuf[500]; -
"输入发送内容:";cout<< -
while(cin.getline(buf,500)) -
{ -
//通过套接字给主机发送字符串 -
//字符串还有个结束标志,send(sclient,buf,strlen(buf)+1,0); -
} -
return0; - }
-
- #include
<iostream>
- #include
<string>
- #include
<winsock2.h>
- #pragma
comment(lib,"ws2_32.lib")
- using
std::cout; - using
std::cin; - using
std::string; - using
std::endl; -
- int
main() - {
-
"服务器启动!....."<<endl;cout<< -
//初始化winsock -
WSADATA wsaD; -
WSAStartup(MAKEWORD(1,1),&wsaD); -
//创建监听套接字 -
SOCKET slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -
// 绑定主机地址和监听套接字 -
structsockaddr_in my_addr; //主机地址 -
my_addr.sin_family=AF_INET; -
//指定端口my_addr.sin_port=htons(8080); -
my_addr.sin_addr.s_addr=htonl(INADDR_ANY); -
structbind(slisten,( sockaddr *)&my_addr, sizeof(my_addr)); -
//启动监听 -
listen(slisten,5); -
//开始接收数据 -
structsockaddr_in c_addr; //客户地址 -
intaddr_len= sizeof(c_addr); -
structSOCKET sconnect=accept(slisten,( sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字 -
"连接已建立......"<<endl;cout<< -
while(true) -
{ -
charbuf[500]; //存储接收的字符 -
intlen=recv(sconnect,buf, sizeof(buf),0); //通过连接套接字接收数据 -
if(len>0) -
{ -
"客户说:"<<buf<<endl;cout<< -
} -
} -
return0; - }
-
- #include
<iostream>
- #include
<string>
- #include
<winsock2.h>
- #pragma
comment(lib,"ws2_32.lib")
- using
std::cout; - using
std::cin; - using
std::string; - using
std::endl; -
- int
main() - {
-
"服务器启动!....."<<endl;cout<< -
//初始化winsock -
WSADATA wsaD; -
WSAStartup(MAKEWORD(1,1),&wsaD); -
//创建监听套接字 -
SOCKET slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -
// 绑定主机地址和监听套接字 -
structsockaddr_in my_addr; //主机地址 -
my_addr.sin_family=AF_INET; -
//指定端口my_addr.sin_port=htons(8080); -
my_addr.sin_addr.s_addr=htonl(INADDR_ANY); -
structbind(slisten,( sockaddr *)&my_addr, sizeof(my_addr)); -
//启动监听 -
listen(slisten,5); //5是最大连接数 -
//开始接收数据 -
structsockaddr_in c_addr; //客户地址 -
intaddr_len= sizeof(c_addr); -
structSOCKET sconnect=accept(slisten,( sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字 -
"连接已建立......"<<endl;cout<< -
while(true) -
{ -
charbuf[500]; //存储接收的字符 -
intlen=recv(sconnect,buf, sizeof(buf),0); //通过连接套接字接收数据 -
if(len>0) -
{ -
"客户说:"<<buf<<endl;cout<< -
} -
} -
return0; - }
- 在创建socket之前要调用WSAStartup(MAKEWORD(1,1),&wsad);
这个函数说明使用的版本是1.1版的,wsad存储系统返回的winsocket信息。
创建socket 调用socket(int af,int type,int protocol) af不清楚,type有SOCK_STREAM(tcp),SOCK_DGRAM(udp)
protocol :通信协议(默认为0)
绑定端口,调用函数bind(SOCKET S,stuct sockaddr *name,int namelen),
S为监听socket,name为主机地址(里面指定了端口) ,namelen为地址变量长度。
接下来使服务器处于监听状态,调用函数listen(SOCKET s,int backlog)
s为监听socket, backlog为最大连接数,最大为5.
客户机连进来后就可通信了,但还要创建一个连接socket.调用accept(SOCKET S,struct sockaddr *addr int *addrlen);
s为监听socket,addr用来存放客户地址,addrlen为长度,然后返回连接socket.
这一步后就可以利用连接socket接收数据了,调用recv(SOCKET s,char *buf,int len,int flags).
s为连接socket,buf来存放接收数据,他为一个字符数组首地址。len为buf的最大长度,不是buf的实际长度,flags为此函数调用的方式
-
- bool
my_recv(SOCKET socket, char*buf, intlength, intflag){ -
intrecv_len = 0; -
shortindex = 0; -
while( length > 0 ){ -
recv_len = recv(socket,&buf[index],length,flag); -
index = index + recv_len; -
length = length - recv_len; -
} -
-
if( 0 == recv_len ){ -
returntrue; -
else{} -
returnfalse; -
} - }
-
- #include
<iostream>
- #include
<iostream>

加载中…