UDP服务器端代码展示:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main() {
// 1. 创建套接字
int socketfd;
socketfd = socket(AF_INET, SOCK_DGRAM, 0);
if (socketfd < 0) {
perror("Create socket error");
return -1;
}
// 2. 初始化套接字地址结构
struct sockaddr_in myaddr;
memset(&myaddr, 0, sizeof(myaddr)); // 将套接字地址结构中的数据置空
myaddr.sin_family = AF_INET; // 设置地址族为IPv4
myaddr.sin_port = htons(5000); // 设置端口号为5000
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置IP地址为本机地址
// 3. 绑定套接字到端口
int ret;
ret = bind(socketfd, (struct sockaddr *)&myaddr, sizeof(myaddr));
if (ret < 0) {
perror("Bind error");
close(socketfd); // 关闭套接字
return -1;
}
// 4. 接收数据
char buf[100] = {0};
// 因为UDP是无连接的,所以我们不需要监听,直接接收数据即可
while (1) {
struct sockaddr_in cliaddr; // 定义客户端地址结构
socklen_t addrln = sizeof(cliaddr); // 定义地址长度
int rect_ret;
rect_ret = recvfrom(socketfd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &addrln);
if (rect_ret < 0) {
perror("Receive error");
continue; // 如果接收失败,继续下一次循环
}
// 打印接收到的数据
printf("Received from client: %s\n", buf);
}
// 关闭套接字
close(socketfd);
return 0;
}
UDP客户端端代码展示:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
int socketfd; //用来接收套接字文件描述符
//1.创建套接字,判断是否创建成功
socketfd = socket(AF_INET,SOCK_DGRAM,0);
if(socket <0)
{
perror("creat error ");
return -1;
}
//2.初始化我们的套接字,将套接字里面的内容置空
struct sockaddr_in sendaddr;
memset(&sendaddr,0,sizeof(sendaddr));
sendaddr.sin_family = AF_INET;//规定网络类型
sendaddr.sin_port = htons(5000);//绑定端口号
sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");//绑定ip地址
//3.发送数据
char buf[100];
while(1)
{
int rect_ret;
printf("send:%s\n",buf);
fgets(buf,sizeof(buf),stdin);
rect_ret = sendto(socketfd,buf,sizeof(buf),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));//sendto用于通过套接字将数据发送到指定的端口,地址
if(rect_ret < 0)//判断是否发送成功
{
printf("error ");
return -1;
}
}
close(socketfd);// 关闭套接字
return 0;
}
UDP的简单通信:
服务器端:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
int socketfd;
socketfd = socket(AF_INET,SOCK_DGRAM,0);
if(socket < 0)
{
printf("create error");
return -1;
}
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(5000);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret;
ret = bind(socketfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret < 0)
{
perror("bind error ");
return -1;
}
char buf[100] = {0};
struct sockaddr_in cliaddr;
memset(&cliaddr,0,sizeof(cliaddr));
int addrln = sizeof(cliaddr);
//监听
while(1)
{
int rect_ret;
rect_ret = recvfrom(socketfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&addrln);
if(rect_ret < 0)
{
perror("recv error ");
return -1;
}
//printf("recv success\n");
printf("he :%s",buf);
memset(buf,0,sizeof(buf));
printf("you : %s",buf);
fgets(buf,sizeof(buf),stdin);
int send_ret;
send_ret = sendto(socketfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
if(send_ret < 0)
{
perror("send error ");
return -1;
}
//printf("send success\n");
}
close(socketfd);
return 0;
}
客户端:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
//创建套接字
int socketfd;
socketfd = socket(AF_INET,SOCK_DGRAM,0);
if(socket <0)
{
perror("creat error ");
return -1;
}
//初始化套接字
struct sockaddr_in sendaddr;
memset(&sendaddr,0,sizeof(sendaddr));
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(5000);
sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
char buf[100];
//data
int addrln = sizeof(sendaddr);
while(1)
{
int rect_ret;
memset(buf,0,sizeof(buf));
printf("you :%s",buf);
fgets(buf,sizeof(buf),stdin);
rect_ret = sendto(socketfd,buf,sizeof(buf),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));
if(rect_ret < 0)
{
printf("error ");
return -1;
}
//printf("send success\n");
memset(buf,0,sizeof(buf));
rect_ret = recvfrom(socketfd,buf,sizeof(buf),0,(struct sockaddr *)&sendaddr,&addrln);
printf("he : %s",buf);
if(rect_ret < 0 )
{
perror("recv error");
return -1;
}
//printf("recv success\n");
}
close(socketfd);
return 0;
}
TCP服务器:
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
//创建套接字
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0)
{
perror("creat error ");
return -1;
}
//初始化的套接字
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(5000);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//绑定套接字
int ret;
ret = bind(socketfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret < 0)
{
perror("bind error ");
return -1;
}
//监听
if(listen(socketfd,1024) < 0)
{
perror("listen error ");
return -1;
}
printf("listen .....\n");
//初始化客户端的地址
struct sockaddr_in cliaddr;
memset(&cliaddr,0,sizeof(cliaddr));
int cliaddrln = sizeof(cliaddr);
//接受连接
int connfd;
connfd = accept(socketfd,(struct sockaddr *)&cliaddr,&cliaddrln);
//开始执行
while(1)
{
char buf[100] = {0};
if(connfd < 0)
{
perror("accept error ");
return -1;
}
//接收消息
int ret;
ret = recv(connfd,buf,sizeof(buf),0);
if(ret < 0)
{
perror("recv error ");
return -1;
}
printf("recv :%s",buf);
}
close(connfd);
close(socketfd);
return 0;
}
TCP客户端:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
//创建套接字
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socket <0)
{
perror("creat error ");
return -1;
}
//初始化套接字
struct sockaddr_in sendaddr;
memset(&sendaddr,0,sizeof(sendaddr));
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(5000);
sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//与服务器建立连接
int ret1;
ret1 = connect(socketfd,(struct sockaddr *)&sendaddr,sizeof(sendaddr));
if(ret1 < 0)
{
perror("connect error ");
return -1;
}
//发送数据
char buf[100];
while(1)
{
int rect_ret;
printf("send:%s\n",buf);
fgets(buf,sizeof(buf),stdin);
rect_ret = send(socketfd,buf,sizeof(buf),0);
if(rect_ret < 0)
{
printf("error ");
return -1;
}
}
close(socketfd);
return 0;
}
TCP简单通信:
服务器端
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
//创建套接字
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0)
{
perror("creat error ");
return -1;
}
//初始化自己的套接字
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(5000);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//绑定套接字
int ret;
ret = bind(socketfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret < 0)
{
perror("bind error ");
return -1;
}
//监听
if(listen(socketfd,1024) < 0)
{
perror("listen error ");
return -1;
}
printf("listen .....\n");
//初始化监听的套接字
struct sockaddr_in cliaddr;
memset(&cliaddr,0,sizeof(cliaddr));
int cliaddrln = sizeof(cliaddr);
//转换文件描述符为监听的套接字
int connfd;
connfd = accept(socketfd,(struct sockaddr *)&cliaddr,&cliaddrln);
//开始执行
while(1)
{
char buf[100] = {0};
if(connfd < 0)
{
perror("accept error ");
return -1;
}
//接收消息
int ret;
ret = recv(connfd,buf,sizeof(buf),0);
if(ret < 0)
{
perror("recv error ");
return -1;
}
printf("he :%s",buf);
memset(buf,0,sizeof(buf));
printf("you : %s",buf);
fgets(buf,sizeof(buf),stdin);
ret = send(connfd,buf,sizeof(buf),0);
if(ret < 0)
{
perror("sendto error ");
return -1;
}
//printf("sendto success\n");
}
close(connfd);
close(socketfd);
return 0;
}
客户端
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
//创建套接字
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socket <0)
{
perror("creat error ");
return -1;
}
//初始化套接字
struct sockaddr_in sendaddr;
memset(&sendaddr,0,sizeof(sendaddr));
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(5000);
sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret;
ret = connect(socketfd,(struct sockaddr *)&sendaddr,sizeof(sendaddr));
if(ret < 0)
{
perror("connect error \n");
return -1;
}
char buf[100];
//data
int addrln = sizeof(sendaddr);
while(1)
{
int rect_ret;
memset(buf,0,sizeof(buf));
printf("you :%s",buf);
fgets(buf,sizeof(buf),stdin);
rect_ret = send(socketfd,buf,sizeof(buf),0);
if(rect_ret < 0)
{
printf("error ");
return -1;
}
//printf("send success\n");
memset(buf,0,sizeof(buf));
rect_ret = recv(socketfd,buf,sizeof(buf),0);
if(rect_ret < 0)
{
perror("recv error \n");
return -1;
}
//printf("recv success\n");
printf("he : %s",buf);
}
close(socketfd);
return 0;
}
多进程并发 TCP 代码:
服务端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/wait.h>
void fun(int sig)
{
while(waitpid(-1,NULL,WNOHANG) > 0);//回收资源,直到进程执行结束
}
int main()
{
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socket < 0)
{
printf("create error");
return -1;
}
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(6666);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret;
ret = bind(socketfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret < 0)
{
perror("bind error ");
return -1;
}
printf("bind success\n");
if( listen(socketfd,1024) < 0)
{
perror("listen error \n");
return -1;
}
printf("listing ...... \n");
signal(SIGCHLD,fun);//检测子进程执行状态
char buf[100] = {0};
struct sockaddr_in cliaddr;
int addrln =sizeof(cliaddr);
while(1)
{
int connfd;
connfd = accept(socketfd,NULL,NULL);
if(connfd < 0)
{
perror("accept error ");
return -1;
}
pid_t pid = fork();
if(pid < 0)
{
perror("fork error ");
return -1;
}else if(pid == 0){
close(socketfd);
while(1)
{
memset(buf, 0, sizeof(buf));
int ret;
ret = recv(connfd,buf,sizeof(buf),0);
if(ret < 0)
{
perror("read error");
return -1;
}
printf("收到:%s\n",buf);
}
close(connfd);
exit(0);
}
}
close(socketfd);
return 0;
}
客户端
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
//创建套接字
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socket <0)
{
perror("creat error ");
return -1;
}
//初始化套接字
struct sockaddr_in sendaddr;
memset(&sendaddr,0,sizeof(sendaddr));
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(6666);
sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret;
ret = connect(socketfd,(struct sockaddr *)&sendaddr,sizeof(sendaddr));
if(ret < 0)
{
perror("connect error \n");
return -1;
}
char buf[100];
//data
int addrln = sizeof(sendaddr);
while(1)
{
int rect_ret;
memset(buf,0,sizeof(buf));
printf("you :%s",buf);
fgets(buf,sizeof(buf),stdin);
rect_ret = send(socketfd,buf,sizeof(buf),0);
if(rect_ret < 0)
{
printf("error ");
return -1;
}
//printf("send success\n");
}
close(socketfd);
return 0;
}