Linux C Socket简单实例与详细注释

时间:2022-07-15 01:11:57

最近做的东西与socket十分紧密,所以很好奇它具体是如何实现的,以前也有了解过,但是又忘记了,于是把它记录下来,以便日后查看。

服务器端:server.c

#include <sys/types.h>
#include
<sys/socket.h>
#include
<stdio.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<unistd.h>
#include
<string.h>
#include
<stdlib.h>
#include
<fcntl.h>
#include
<sys/shm.h>

#define MYPORT 8887
#define QUEUE 20
#define BUFFER_SIZE 1024

int main()
{
///定义sockfd
int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);

///定义sockaddr_in
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family
= AF_INET;
server_sockaddr.sin_port
= htons(MYPORT);
server_sockaddr.sin_addr.s_addr
= htonl(INADDR_ANY);

///bind,成功返回0,出错返回-1
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
{
perror(
"bind");
exit(
1);
}

///listen,成功返回0,出错返回-1
if(listen(server_sockfd,QUEUE) == -1)
{
perror(
"listen");
exit(
1);
}

///客户端套接字
char buffer[BUFFER_SIZE];
struct sockaddr_in client_addr;
socklen_t length
= sizeof(client_addr);

///成功返回非负描述字,出错返回-1
int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
if(conn<0)
{
perror(
"connect");
exit(
1);
}

while(1)
{
memset(buffer,
0,sizeof(buffer));
int len = recv(conn, buffer, sizeof(buffer),0);
if(strcmp(buffer,"exit\n")==0)
break;
fputs(buffer, stdout);
send(conn, buffer, len,
0);
}
close(conn);
close(server_sockfd);
return 0;
}

客户端:client.c

#include <sys/types.h>
#include
<sys/socket.h>
#include
<stdio.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<unistd.h>
#include
<string.h>
#include
<stdlib.h>
#include
<fcntl.h>
#include
<sys/shm.h>

#define MYPORT 8887
#define BUFFER_SIZE 1024

int main()
{
///定义sockfd
int sock_cli = socket(AF_INET,SOCK_STREAM, 0);

///定义sockaddr_in
struct sockaddr_in servaddr;
memset(
&servaddr, 0, sizeof(servaddr));
servaddr.sin_family
= AF_INET;
servaddr.sin_port
= htons(MYPORT); ///服务器端口
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///服务器ip

///连接服务器,成功返回0,错误返回-1
if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
perror(
"connect");
exit(
1);
}

char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
{
send(sock_cli, sendbuf, strlen(sendbuf),
0); ///发送
if(strcmp(sendbuf,"exit\n")==0)
break;
recv(sock_cli, recvbuf,
sizeof(recvbuf),0); ///接收
fputs(recvbuf, stdout);

memset(sendbuf,
0, sizeof(sendbuf));
memset(recvbuf,
0, sizeof(recvbuf));
}

close(sock_cli);
return 0;
}