赞
踩
服务器
#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); }
camera_server.c
int main(int argc, char **argv) { if(2 != argc) { printf("Usage: %s <video>\n", argv[0]); return -1; } int i; int fd; int ret; unsigned int width; unsigned int height; unsigned int size; unsigned int index; unsigned int ismjpeg; width = 640; height = 480; //1. 打开并初始化摄像头 fd = camera_init(argv[1], &width, &height, &size, &ismjpeg); if (fd == -1) return -1; ret = camera_start(fd); if (ret == -1) return -1; //2. 采集几张图片丢弃 char *jpeg_ptr = NULL; for (i = 0; i < 8; i++) { ret = camera_dqbuf(fd, (void **)&jpeg_ptr, &size, &index); if (ret == -1) exit(EXIT_FAILURE); ret = camera_eqbuf(fd, index); if (ret == -1) exit(EXIT_FAILURE); } fprintf(stdout, "init camera success\n"); //等着客户端连上来 //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(8888); if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) { perror("connect"); return -1; } //3.监听 listen(sockfd, 10); //4. 提取接入 int clientfd = accept(sockfd, NULL, NULL); while(1) { //3. 提取摄像头的一帧 ret = camera_dqbuf(fd, (void **)&jpeg_ptr, &size, &index); //tack picture if (ret == -1) return -1; printf("taking one!\n"); //发给客户端 //a.发大小 char buf[10] = {0}; sprintf(buf, "%d", size);//将printf("%d",size)的输出结果送给buf /* int write(int handle,void *buf,int len); int handle:获取文件指针的文件句柄 void *buf:写入的内容 int len:写入文件的长度 */ write(clientfd, buf, 10); //b. 发内容 int ret = write(clientfd, jpeg_ptr, size); printf("size: %d\n", ret); /* //4. 创建一个空白文件 int pixfd = open("1.jpg", O_WRONLY|O_CREAT, 0666); //5. 将摄像头数据写入文件(发出去jpeg_ptr数组起始位置size数组大小) write(pixfd, jpeg_ptr, size); //测试用 break; */ //6. 确认已经取走 ret = camera_eqbuf(fd, index); //prepare for next tacking if (ret == -1) return -1; } //7. 关掉摄像头 ret = camera_stop(fd); //stop the camera!!!! do not call this!!! if (ret == -1) return -1; //8. 退出摄录 ret = camera_exit(fd); if (ret == -1) return -1; }
camera_client
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QLabel> #include <QTcpSocket> #include <QDebug> class Widget : public QWidget { Q_OBJECT public slots: void readpix() { if(readsize)//读大小 { //1. 接照片大小 char sizebuf[10] = {0}; sock->read(sizebuf, sizeof(sizebuf)); size = atoi(sizebuf); qDebug()<<size; readsize = false; } else if(sock->bytesAvailable() >= size)//照片完全到达 { //2. 接收照片内容 char buf[640*480*3] = {0}; int ret = sock->read(buf, size); qDebug()<<ret; //3. 显示照片 QPixmap a; a.loadFromData((uchar*)buf, size); lb->setPixmap(a); readsize = true; } } public: Widget(QWidget *parent = 0); ~Widget(); QLabel *lb; QTcpSocket *sock; bool readsize; int size; }; #endif // WIDGET_H
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。