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