
服務器端(server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#define ERROR -1 //例外退出
#define NOR_MAL 1 //正常退出
#define Max 124
const ushort port = 49999;//埠號
static int server_fd;//服務器的檔案描述符
//服務器的初始化
int server_init(ushort port)
{
//建立流式套接字
server_fd = socket(AF_INET,SOCK_STREAM,0);
if(server_fd == -1){
perror("socket()");
goto ERR_STEP;
}
//服務端的地址結構(ipv4)
//htons進行大小端轉化
//INADDR_ANY表示任意ip地址,系統提供的宏
struct sockaddr_in server_addr = {
.sin_family = AF_INET,
.sin_port = htons(port),
.sin_addr.s_addr = htonl(INADDR_ANY),
};
//服務端的地址長度
socklen_t len = sizeof(server_addr);
//系結套接字,地址
if(bind(server_fd,(struct sockaddr *)&server_addr,len) < 0){
perror("bind");
goto ERR_STEP;
}
//設定監聽套接字,允許最大連接的套接字
if(listen(server_fd,10) < 0){
perror("listen");
goto ERR_STEP;
}
//回傳檔案描述符
return server_fd;
ERR_STEP:
close(server_fd);
return ERROR;
}
int main(int argc,char *argv[])
{
//初始化
int fd = server_init(port);
//客戶端的地址
struct sockaddr_in client_addr;
//客戶端的地址長度
socklen_t len = sizeof(client_addr);
printf("waiting for conncet ...\n");
//設定連接套接字
int connfd = accept(fd,(struct sockaddr*)&client_addr,&len);
if(fd < 0){
perror("accept");
goto ERR_STEP;
}
//列印客戶端的ip地址和埠號
printf("client ip is %s\n",inet_ntoa(client_addr.sin_addr));
printf("client port is %u\n",ntohs(client_addr.sin_port));
//回圈接收資料
while(1){
//讀緩沖區
char readBuf[Max] = {0};
//每次讀取資料之前先清慷訓沖區
memset(readBuf,0,sizeof(readBuf));
//讀取數字,從連接套接字中讀取,如果填寫的不是connfd而是fd的話
//讀取資料的時候應該從客戶端中讀取
//系統會報錯,提示Transport endpoint is not connected
int ret = read(connfd,readBuf,sizeof(readBuf)-1);
if(ret > 0){//回傳值大于0表示讀取資料成功
printf("%s\n",readBuf);
}else if(ret == 0){//回傳值為0的時候,表示客戶端斷開連接
printf("the client is disconnect\n");
goto ERR_STEP;
}else {
printf("recv failed\n");
goto ERR_STEP;
}
//當接收到的資料為quit的時候,結束退出
int err = strncmp(readBuf,"quit",4);
if(err == 0){
printf("client is quit...\n");
return NOR_MAL;
}
}
ERR_STEP:
close(fd);
return ERROR;
}
客戶端實作(clinet.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#define ERROR -1
#define Max 124
//服務器的ip地址和埠號
//這里用的是回環地址,適用于同一臺計算機上
//如果采用的是兩臺計算機,應該填充服務器的具體ip地址
const char *ip = "127.0.0.1";
const ushort port = 49999;
int main(int argc,const char *argv[])
{
//建立流式套接字
int server_fd = socket(AF_INET,SOCK_STREAM,0);
if(server_fd == -1){
perror("socket()");
goto ERR_STEP;
}
//服務器的地址結構
//inet_addr將字串形式的ip地址轉換成網路位元組序的整型值
struct sockaddr_in server_addr = {
.sin_family = AF_INET,
.sin_port = htons(port),
.sin_addr.s_addr = inet_addr(ip),
};
//服務器的地址長度
socklen_t len = sizeof(server_addr);
//連接服務器
if((connect(server_fd,(struct sockaddr*)&server_addr,len))< 0){
perror("connect");
goto ERR_STEP;
}else{
printf("connect successed\n");
}
//回圈發送資料
while(1){
//寫緩沖區
char writeBuf[Max] = {0};
memset(writeBuf,0,sizeof(writeBuf));
scanf("%s",writeBuf);
int ret = write(server_fd,writeBuf,strlen(writeBuf));
if(ret < 0){
perror("write");
goto ERR_STEP;
}
//當輸入quit的時候,客戶端斷開連接
int err = strncmp(writeBuf,"quit",4);
if(err == 0){
printf("disconnet...\n");
goto ERR_STEP;
}
}
ERR_STEP:
close(server_fd);
return ERROR;
}
運行:
服務器:gcc server.c -o s (-o表示生成可執行檔案)
客戶端:gcc client.c -o c


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280269.html
標籤:其他
