基于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() - {
-
cout<< -
-
WSADATA wsaD; -
WSAStartup(MAKEWORD(1,1),&wsaD); -
-
SOCKET sclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -
-
sockaddr_in servaddr; -
servaddr.sin_family=AF_INET; -
servaddr.sin_addr.s_addr=inet_addr( //指定服务器 -
servaddr.sin_port=htons(8080); -
cout<< -
flag[3]; -
gets(flag); -
-
{ -
connect(sclient,( sockaddr*)&servaddr, sizeof(servaddr));//通过套接字连接主机 -
} -
-
-
buf[500]; -
cout<< -
-
{ -
-
send(sclient,buf,strlen(buf)+1,0); -
} -
0; - }
-
- #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() - {
-
cout<< -
-
WSADATA wsaD; -
WSAStartup(MAKEWORD(1,1),&wsaD); -
-
SOCKET slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -
-
sockaddr_in my_addr; //主机地址 -
my_addr.sin_family=AF_INET; -
my_addr.sin_port=htons(8080); -
my_addr.sin_addr.s_addr=htonl(INADDR_ANY); -
bind(slisten,( sockaddr *)&my_addr, sizeof(my_addr)); -
-
listen(slisten,5); -
-
sockaddr_in c_addr; //客户地址 -
addr_len= sizeof(c_addr); -
SOCKET sconnect=accept(slisten,( sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字 -
cout<< -
-
{ -
buf[500]; //存储接收的字符 -
len=recv(sconnect,buf, sizeof(buf),0); -
-
{ -
cout<< -
} -
} -
0; - }
-
- #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() - {
-
cout<< -
-
WSADATA wsaD; -
WSAStartup(MAKEWORD(1,1),&wsaD); -
-
SOCKET slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -
-
sockaddr_in my_addr; //主机地址 -
my_addr.sin_family=AF_INET; -
my_addr.sin_port=htons(8080); -
my_addr.sin_addr.s_addr=htonl(INADDR_ANY); -
bind(slisten,( sockaddr *)&my_addr, sizeof(my_addr)); -
-
listen(slisten,5); //5是最大连接数 -
-
sockaddr_in c_addr; //客户地址 -
addr_len= sizeof(c_addr); -
SOCKET sconnect=accept(slisten,( sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字 -
cout<< -
-
{ -
buf[500]; //存储接收的字符 -
len=recv(sconnect,buf, sizeof(buf),0); -
-
{ -
cout<< -
} -
} -
0; - }
- 在创建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){ -
recv_len = 0; -
index = 0; -
-
recv_len = recv(socket,&buf[index],length,flag); -
index = index + recv_len; -
length = length - recv_len; -
} -
-
-
true; -
} -
false; -
} - }
-
- #include
<iostream>
- #include
<iostream>