(1)
/*console 下的内网聊天室*/
TcpChatSrv(服务器端)
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET SockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrsrv;
addrsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
/Sockets htonl function converts a u_long from host to TCP/IP network byte order (which is big-endian).
转换主机字节序到网络字节序
服务器端绑定INADDR_ANY (0.0.0.0) 即是服务器有多个ip。告诉操作系统:“我需要在 yyyy 端口上侦听,所以发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。*/
addrsrv.sin_family=AF_INET;
addrsrv.sin_port=6000;
bind(SockSrv,(sockaddr*)&addrsrv,sizeof(SOCKADDR));
listen(SockSrv,10);
int len=sizeof(SOCKADDR);
SOCKADDR_IN addrclient;
SOCKET SockConnect=accept(SockSrv,(sockaddr*)&addrclient,&len);
char sendbuf[100];
char recvbuf[100];
char tempbuf[100];
while (1)
{
recv(SockConnect,recvbuf,100,0);
if('q'==recvbuf[0]){
printf("%s/n","客户端请求退出!");
send(SockConnect,"q",sizeof('q')+1,0);
break;}
sprintf(tempbuf,"%s say:%s",inet_ntoa(addrclient.sin_addr),recvbuf);
/*格式化几个字符数组到一个数组中,inet_ntoa function convers an (ipv4)network address into a string */
printf("%s/n",tempbuf);
printf("please input data!/n");
gets(sendbuf);
send(SockConnect,sendbuf,strlen(sendbuf)+1,0);
}
closesocket(SockConnect);
closesocket(SockSrv);
WSACleanup();
}
TcpChatClient(客户端)
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET SocketClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN AddrSrv;
AddrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
/*inet_addr convers string(ipv4) to address for the IN_ADDR structrue.转换string 到 IN_ADDR*/
AddrSrv.sin_family=AF_INET;
AddrSrv.sin_port=6000;
connect(SocketClient,(sockaddr*)&AddrSrv,sizeof(SOCKADDR));
char sendbuf[100];
char recvbuf[100];
char tempbuf[100];
while (1)
{
printf("please input data!/n");
gets(sendbuf);
send(SocketClient,sendbuf,strlen(sendbuf)+1,0);
recv(SocketClient,recvbuf,100,0);
if(recvbuf[0]=='q')
{
printf("%s/n","服务器端请求退出!");
send(SocketClient,"q",2,0);
break;
}
sprintf(tempbuf,"%s say:%s",inet_ntoa(AddrSrv.sin_addr),recvbuf);
printf("%s",recvbuf);
}
closesocket(SocketClient);
WSACleanup();
}
心得::printf("%s",recvbuf);//这句话中%s的s必须为小写 ,否则编译无错,但不能显示数据。