项目名称 | 【苏嵌实训-嵌入式 linux C 第 9天】 |
---|---|
今日进度以及任务 | 嵌入式Linux C网络编程加线程 |
本日任务完成情况 | 笔记见表格下方。 |
本日开发中出现的问题汇总 | 无 |
本日未解决问题 | 无 |
本日开发收获 | 学习了网络编程加线程的代码实现 |
其他 | 无 |
TCP的服务端:
#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 <pthread.h>
//ctrl C 退出
#define PORT 33333
void * recv_message(void *arg)
{
int ret;
int cfd = *((int *)arg);
char buffer[1024];
while(1)
{
memset(buffer,0,sizeof(buffer));
if((ret = recv(cfd,buffer,sizeof(buffer),0)) < 0)
{
perror("recv error!");
exit(1);
}
if(ret == 0)
{
printf("%d is close!\n",cfd);
pthread_exit(NULL);
}
printf("recv = %s\n",buffer);
usleep(3);
}
pthread_exit(NULL);
}
void * send_message(void *arg)
{
int ret;
int cfd = *((int *)arg);
while(1)
{
if((ret = send(cfd,"hello world",12,0)) < 0)
{
perror("send error!");
exit(1);
}
if(ret == 0)
{
printf("%d is close!\n",cfd);
pthread_exit(NULL);
}
sleep(5);
}
pthread_exit(NULL);
}
int main()
{
int sockfd;
int cfd;
int c_len;
char buffer[1024];
pthread_t id;
struct sockaddr_in addr;
struct sockaddr_in c_addr;
//创建套接字:socket函数
sockfd = socket(AF_INET,SOCK_STREAM,0);//IPV4,TCP
if(sockfd == -1)
{
perror("socket create error!");
exit(1);
}
printf("socket success!\n");
//先关客户端,再关服务器,否则会出现无法绑定的问题
int opt = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
//以上为无法绑定解决
//给套接字绑定IP地址和端口号:bind函数
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);//字节序转化//转成本地的
addr.sin_addr.s_addr = inet_addr("192.168.137.129");//将网络地址转化为二进制数
if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr_in)) < 0)
{
perror("bind error!");
exit(1);
}
printf("bind success!\n");
//将套接字文件描述符,从主动变为被动文件描述符(做监听准备):listen函数
if(listen(sockfd,3) < 0)
{
perror("listen error!");
exit(1);
}
printf("listen success!\n");
//被动监听客户的连接并响应:accept函数
while(1)
{
memset(buffer,0,sizeof(buffer));
bzero(&c_addr,sizeof(struct sockaddr_in));
c_len = sizeof(struct sockaddr_in);
cfd = accept(sockfd,(struct sockaddr *)(&c_addr),&c_len);
printf("accept............!\n");
if(cfd == -1)
{
perror("accept error!");
exit(1);
}
printf("accept success!\n");
printf("port = %d,ip = %s\n",ntohs(c_addr.sin_port),inet_ntoa(c_addr.sin_addr));
if(pthread_create(&id,NULL,recv_message,(void *)(&cfd)) != 0)
{
perror("pthread create error!");
exit(1);
}
if(pthread_create(&id,NULL,send_message,(void *)(&cfd)) != 0)
{
perror("pthread create error!");
exit(1);
}
usleep(3);//毫秒级休眠
}
return 0;
}
TCP的客户端:
#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 <pthread.h>
#define PORT 33333
void * recv_message(void *arg)
{
int ret;
int sockfd = *((int *)arg);
char buffer[1024];
while(1)
{
memset(buffer,0,sizeof(buffer));
if((ret = recv(sockfd,buffer,sizeof(buffer),0)) < 0)
{
perror("recv error!");
exit(1);
}
if(ret == 0)
{
printf("%d is close!\n",sockfd);
pthread_exit(NULL);
}
printf("recv server = %s\n",buffer);
usleep(3);
}
pthread_exit(NULL);
}
int main()
{
int sockfd;
char buffer[1024];
struct sockaddr_in s_addr;
pthread_t id;
//创建套接字
sockfd = socket(AF_INET,SOCK_STREAM,0);//IPV4,TCP
if(sockfd == -1)
{
perror("socket create error!");
exit(1);
}
printf("socket success!\n");
//连接
bzero(&s_addr,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
s_addr.sin_addr.s_addr = inet_addr("192.168.137.129");
if(connect(sockfd,(struct sockaddr *)(&s_addr),sizeof(struct sockaddr_in)) < 0)
{
perror("connect error!");
exit(1);
}
printf("connect success!\n");
if(pthread_create(&id,NULL,recv_message,(void *)(&sockfd)) != 0)
{
perror("pthread create error");
exit(1);
}
while(1)
{
memset(buffer,0,sizeof(buffer));
printf("Please input send message:\n");
scanf("%s",buffer);
write(sockfd,buffer,12);
usleep(3);
}
shutdown(sockfd,SHUT_RDWR);
return 0;
}