服务器
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(){
//创建套接字
/*
int socket(int af, int type, int protocol);
af:地址族 常用的有 AF_INET(IPv4 地址) 和 AF_INET6(IPv6)
type:数据传输方式常用的有 SOCK_STREAM 和 SOCK_DGRAM
protocol:传输协议,常用的有 IPPROTO_TCP(TCP 传输协议) 和 IPPTOTO_UDP(UDP 传输协议)
返回值:非负描述符 – 成功,-1 - 出错
*/
int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//将套接字和IP、端口绑定
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("192.168.183.138"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//进入监听状态,等待用户发起请求
/*
int listen(int sock, int backlog);
sock:为需要进入监听状态的套接字
backlog:为请求队列的最大长度
*/
listen(serv_sock, 20);
//接收客户端请求
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr);
int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
//向客户端发送数据
char str[] = "Hello World!";
write(clnt_sock, str, sizeof(str));
//关闭套接字
close(clnt_sock);
close(serv_sock);
return 0;
}
客户端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(){
//创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//读取服务器传回的数据
char buffer[40];
read(sock, buffer, sizeof(buffer)-1);
printf("Message form server: %s\n", buffer);
//关闭套接字
close(sock);
return 0;
}
tcpClient.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(int argc, char *argv[])
{
if(3 != argc)
{
printf("%s <IP> <PORT>\n", argv[0]);
return -1;
}
//1. 申请网卡
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sockfd)
{
perror("socket");
return -1;
}
//2. 连接服务器
struct sockaddr_in serveraddr = {
0};
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));
if(-1 == connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
{
perror("connect");
return -1;
}
while(1)
{
char buf[100] = {
0};
printf("input> ");fflush(stdout);
gets(buf);
//3. 发请求
write(sockfd, buf, 100);
//4. 收反馈
bzero(buf, 100);
read(sockfd, buf, 100);
printf("recv: %s\n", buf);
}
//5. 断开连接
close(sockfd);
}
tcpServer.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/ioctl.h>
#define PWMON _IO('P', 0)
#define PWMOFF _IO('P', 1)
#define PWMSET _IO('P', 2)
#define LEDON _IO('L',0)
#define LEDOFF _IO('L',2)
#define TYPE 'c'
#define temp_9 _IO(TYPE,0)
#define temp_10 _IO(TYPE,1)
#define temp_11 _IO(TYPE,2)
#define temp_12 _IO(TYPE,3)
#define PATH "/dev/ds18b20"
int main()
{
//1. 申请网卡
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sockfd)
{
perror("socket");
return -1;
}
//2. 准备被客户端连接
struct sockaddr_in serveraddr = {
0};
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");
serveraddr.sin_port = htons(8886);
if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
{
perror("connect");
return -1;
}
//3.监听
listen(sockfd, 10);
//4. 提取接入
int clientfd = accept(sockfd, NULL, NULL);
int fdl = open("/dev/led0", O_RDWR);
int fdt;
short temp;
char zheng,fen;
float temputer,resolution;
fdt = open(PATH,O_RDWR);
if(fdt < 0){
perror("open");
return -1;
}
if(ioctl(fdt,temp_12,&resolution))
{
perror("ioctl \n");
return -1;
}
while(1)
{
//5. 收请求
char buf[30] = {
0};
read(clientfd, buf, 100);
printf("recv: %s\n", buf);
switch(buf[0])
{
case '1':
//beep on
ioctl(fdl, LEDON);
break;
case '2':
//beep off
ioctl(fdl, LEDOFF);
break;
case '3':
if(!read(fdt,&temp,sizeof(short))){
perror("read");
}
zheng = temp>>4;
fen = temp & 0xf;
if(zheng & (1<<8)){
temputer = (temp - 65535) * resolution;
}else{
temputer = zheng + fen * resolution;
}
if((temputer >= (-55)) && (temputer <= 125))
sprintf(buf,"tempter:%0.3f\n",temputer);
}
//6. 发反馈
write(clientfd, buf, 100);
}
//7. 断开连接
close(sockfd);
close(clientfd);
close(fdt);
}