2 回答

TA貢獻1815條經(jīng)驗 獲得超13個贊
既然把分給了我就應(yīng)該幫你解決的,這是一個簡單的聊天室,測試后可以。你看下源代碼好了。服務(wù)器端程序:
1,創(chuàng)建套接字(socket)。
2,將套接字綁定到本地地址和端口上(bind)。
3,等待接受數(shù)據(jù)(recvfrom)。
4,關(guān)閉套接字。#include <iostream.h>
#include <stdio.h>
#include <Winsock2.h> //必須加載套接字的頭文件,還必須在工程的鏈接處添加 Ws2_32.lib
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
//請求套接字版本
wVersionRequested = MAKEWORD( 1, 1 ); //用MAKEWORD宏請求1.1版本的Winsock庫
err = WSAStartup( wVersionRequested, &wsaData ); //加載套字節(jié),確定使用版本
if ( err != 0 )
{
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) //低字節(jié)和高字節(jié)是不是1
{
WSACleanup( ); //終止對Winsock庫的使用
return 0;
}
//創(chuàng)建套接字
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0); //定義一個sock用來接受返回的套接字
//定義一個地址結(jié)構(gòu)體
SOCKADDR_IN ip;
ip.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //IP,或者用ip.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
ip.sin_family=AF_INET; //指定地址族
ip.sin_port=htons(8888); //端口 //綁定套接字
bind(sock,(SOCKADDR*)&ip,sizeof(SOCKADDR)); char sendbuf[100]; //發(fā)送數(shù)據(jù)
char recvbuf[100]; //接受數(shù)據(jù)
char temp[200]; //其他用處 SOCKADDR_IN client; //用于接受客戶端的地址信息
int len=sizeof(SOCKADDR); //長度
while(true)
{
//接受數(shù)據(jù)
recvfrom(sock,recvbuf,100,0,(SOCKADDR*)&client,&len);
if(strcmp("out",recvbuf)==0)
{
sendto(sock,"out",sizeof("out")+1,0,(SOCKADDR*)&client,len); //地址在我們調(diào)用recvfrom已經(jīng)得到了
cout<<"客戶端程序已經(jīng)退出,聊天終止\n";
break;
}
sprintf(temp,"IP是%s的人說:%s",inet_ntoa(client.sin_addr),recvbuf);
cout<<temp<<endl;
cin.getline(sendbuf,100);
sendto(sock,sendbuf,sizeof(sendbuf)+1,0,(SOCKADDR*)&client,len);
}
closesocket(sock);
WSACleanup();
return 0;
}
----------------
客戶端程序:
1,創(chuàng)建套接字(socket)。
2,向服務(wù)器發(fā)送數(shù)據(jù)(sendto)。
3,關(guān)閉套接字。#include <Winsock2.h> //必須加載套接字的頭文件,還必須在工程的鏈接處添加 Ws2_32.lib
#include <iostream.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
//請求套接字版本
wVersionRequested = MAKEWORD( 1, 1 ); //用MAKEWORD宏請求1.1版本的Winsock庫
err = WSAStartup( wVersionRequested, &wsaData ); //加載套字節(jié),確定使用版本
if ( err != 0 )
{
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) //低字節(jié)和高字節(jié)是不是1
{
WSACleanup( ); //終止對Winsock庫的使用
return 0;
} //創(chuàng)建套接字
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0);
//發(fā)送數(shù)據(jù)
SOCKADDR_IN fuwuqi;
fuwuqi.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
fuwuqi.sin_family=AF_INET;
fuwuqi.sin_port=htons(8888);
char sendbuf[100];
char recvbuf[100];
char temp[200];
int len=sizeof(SOCKADDR);
while(true)
{
cout<<"請輸入你要說的話\n";
cin.getline(sendbuf,100);
sendto(sock,sendbuf,sizeof(sendbuf)+1,0,(SOCKADDR*)&fuwuqi,len);
recvfrom(sock,recvbuf,100,0,(SOCKADDR*)&fuwuqi,&len);
if(strcmp(recvbuf,"out")==0)
{
cout<<"程序退出\n";
break;
}
sprintf(temp,"服務(wù)器%s說:%s",inet_ntoa(fuwuqi.sin_addr),recvbuf);
cout<<temp<<endl;
}
closesocket(sock);
WSACleanup();
}
- 2 回答
- 0 關(guān)注
- 386 瀏覽
添加回答
舉報