|
服務(wù)器端代碼編寫
#include <stdio.h>
#include <windows.h>
/***定義端口**/
#define PORT 8888
/***定義最大傳輸數(shù)據(jù)量**/
#define MAXDATA 100
/****在入口函數(shù)中輸入主機(jī)IP地址****/
int main(int argc, char** argv)
{
/*定義標(biāo)志,接收到第一個(gè)client時(shí),不在接收其他client*/
int flag = 1;
/*得到socket嵌套字*/
SOCKET server;
/*定義發(fā)送消息的長度*/
int sdMsgLen;
/*啟動(dòng)windows的socket服務(wù)*/
WSADATA wsaData;
WSAStartup(0x101,&wsaData);
char *CloseClient = "bye";
char* CloseC_S = "byebye";
/*定義receive數(shù)據(jù)長度*/
int receive;
int len;
/*創(chuàng)建服務(wù)器*/
struct sockaddr_in serveraddr;
/*創(chuàng)建客戶端*/
struct sockaddr_in addrClient;
/*將serveraddr置零*/
memset((void*)&serveraddr,0,sizeof(serveraddr));
/*定義家族協(xié)議*/
serveraddr.sin_family = AF_INET;
/*定義主機(jī)地址*/
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//);"192.168.1.100"
/*定義主機(jī)端口*/
serveraddr.sin_port = htons(PORT);
/*得到socket嵌套字*/
server = socket(AF_INET,SOCK_STREAM,0);
/*返回值為-1,未啟動(dòng)windows的socket服務(wù)*/
if(server==-1)
{
perror("socket error!");
}
/*綁定成功返回0*/
if(bind(server,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) == -1)
{
perror("不能進(jìn)行綁定!");
exit(1);
}
/*定義客戶端嵌套字*/
SOCKET client;
/*進(jìn)入監(jiān)聽客戶端連接和監(jiān)聽客戶端發(fā)送的消息*/
while(1)
{
/*定義并初始化接收數(shù)據(jù)的存儲(chǔ)*/
char receiveBuffer[MAXDATA] = "\n";
/*定義并初始化發(fā)送數(shù)據(jù)存儲(chǔ)*/
char sendBuffer[MAXDATA] = "\n";
/*采用異步發(fā)送消息*/
bool sendFlag = false;
/*監(jiān)聽客戶端*/
if(listen(server,20) == -1)
{
perror("不能進(jìn)行監(jiān)聽!");
exit(1);
}
/*接收到第一個(gè)用戶后將其鎖定,不在接收其他用戶*/
if(flag)
{
len = sizeof(struct sockaddr_in);
/*得到客戶端的嵌套字*/
client = accept(server,(SOCKADDR*)&addrClient,&len);
if(client == -1)
{
perror("accept error");
continue;
}
printf("新連接: %s \n",inet_ntoa(addrClient.sin_addr));
/*創(chuàng)建一個(gè)消息*/
char* msg = "Hello,Connected Successfully!\n";
int len = strlen(msg);
/*得到send的返回值,返回為發(fā)送消息的長度.若發(fā)送失敗則返回-1*/
int sendLen = send(client,msg,len,0) ;
if(sendLen == -1)
{
perror("消息發(fā)送失敗!\n");
closesocket(client);
}
msg=0;
/*接收到第一個(gè)客戶端,將其鎖定*/
flag = 0;
}
/*得到接收到消息的長度*/
receive = recv(client,receiveBuffer,MAXDATA,0);
/*若消息長度為-1,則接收數(shù)據(jù)失敗*/
if(receive == -1)
{
perror("接收出錯(cuò)!\n");
/*關(guān)閉客戶端*/
closesocket(client);
}
printf("%s\n",receiveBuffer);
/*測(cè)試客戶端發(fā)送的結(jié)束通話標(biāo)志*/
if(strcmp(receiveBuffer,CloseClient) == 0)
{
printf("失去客戶端:%s\n",inet_ntoa(addrClient.sin_addr));
flag = 1;
closesocket(client);
}
else if(strcmp(receiveBuffer,CloseC_S) == 0)
{
closesocket(server);
exit(1);
}
else
{
printf("Client %s send message : %s\n",inet_ntoa(addrClient.sin_addr),receiveBuffer);
/*當(dāng)接收到消息后,服務(wù)器才可以發(fā)送消息*/
sendFlag = true;
}
while(sendFlag)
{
printf("Your Message:");
/*得到服務(wù)器輸入的字符串*/
scanf("%s",sendBuffer);
sdMsgLen = strlen(sendBuffer);
/*得到服務(wù)器發(fā)送消息的長度*/
int sendLen = send(client,sendBuffer,sdMsgLen,0);
if(sendLen == -1)
{
perror("消息發(fā)送失敗!");
closesocket(client);
}
/*結(jié)束服務(wù)器發(fā)送消息模式,改為接收模式*/
sendFlag = false;
}
}
return 0;
}
客戶端代碼編寫
#include <windows.h>
#include <stdio.h>
#include <errno.h>
/*定義與主機(jī)連接的端口*/
#define PORT 8888
/*定義最大傳輸數(shù)據(jù)量*/
#define MAXDATA 100
/*由入口函數(shù)得到需要連接主機(jī)的IP地址*/
int main(int ars,char** arg)
{
/*開啟windows的socket*/
WSADATA wsaData;
WSAStartup(0x101,&wsaData);
/*定義服務(wù)器*/
struct sockaddr_in serveraddr;
/*將serveraddr清零*/
memset((void*)&serveraddr,0,sizeof(serveraddr));
/*定義家族協(xié)議*/
serveraddr.sin_family = AF_INET;
/*得到主機(jī)IP地址*/
serveraddr.sin_addr.s_addr = inet_addr(arg[1]);//);//)"192.168.1.100";
/*得到端口*/
serveraddr.sin_port = htons(PORT);
/*得到socket嵌套字*/
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
/*
*建立TCP連接
*參數(shù)1:socket返回的描述符
*參數(shù)2:主機(jī)IP地址和端口號(hào)指針
*參數(shù)3:遠(yuǎn)端地質(zhì)借口長度
*/
if(connect(s,(struct sockaddr*)&serveraddr,sizeof(serveraddr)) == -1)
{
perror("連接錯(cuò)誤!");
exit(1);
}
/*進(jìn)入監(jiān)聽服務(wù)器發(fā)送消息,采取異步通信*/
while(1)
{
/*初始化接收和發(fā)送數(shù)據(jù)的存儲(chǔ)*/
char receiveBuffer[MAXDATA] = "\n";
char sendBuffer[MAXDATA] = "\n";
/*定發(fā)送模式*/
bool sendFlag = false;
/*如果接收數(shù)據(jù)位-1則接收錯(cuò)誤,正確是recv返回接收到數(shù)據(jù)的長度*/
if(recv(s,receiveBuffer,MAXDATA,0)==-1)
{
perror("接收數(shù)據(jù)錯(cuò)誤!");
exit(1);
}
printf("server %s send message: %s\n",inet_ntoa(serveraddr.sin_addr),receiveBuffer);
/*發(fā)送模式*/
sendFlag = true;
while(sendFlag)
{
char* CloseClient = "bye";
char* CloseC_S = "byebye";
/*得到輸入的數(shù)據(jù)*/
printf("Your Message :");
scanf("%s",sendBuffer);
if(strcmp(sendBuffer,CloseClient) == 0)
{
send(s,CloseClient,strlen(CloseClient),0);
closesocket(s);
exit(1);
}
else{
/*得到發(fā)送數(shù)據(jù)的長度*/
int sendLen = send(s,sendBuffer,strlen(sendBuffer),0);
/*發(fā)送數(shù)據(jù)長度為-1時(shí),發(fā)送失敗*/
if(sendLen == -1)
{
perror("發(fā)送錯(cuò)誤!");
closesocket(s);
}
}
/*發(fā)送模式結(jié)束,進(jìn)入接收模式*/
sendFlag = false;
}
}
return 0;
}
|
|