9.9网编简单TCP,UDP的实现day2
TCP
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h> //套接字的头文件
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<string.h>
#define SER_PORT 8888 //服务器端口号
#define SER_IP "192.168.144.128" //服务器IP地址 int main(int argc, const char *argv[])
{//1、创建一个用于连接的套接字文件描述符int sfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sfd){perror("socket error");return -1;}printf("socket 成功 sfd = %d\n", sfd); //3//设置套接字属性:允许端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、给套接字绑定ip地址和端口号//2.1 封装地址信息结构体变量struct sockaddr_in sin; //地址信息结构体变量sin.sin_family = AF_INET; //通信域地址族sin.sin_port = htons(SER_PORT); //端口号网络字节序sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址网络字节序//2.2 绑定操作if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1){perror("bind error");return -1;}printf("bind success\n");//3、将套接字启动监听if(listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");//4、阻塞等等客户端的连接,如果有新客户端连接,//则创建一个用于通信的套接字struct sockaddr_in cin; //用于接受客户端套接字信息socklen_t addrlen = sizeof(cin); //用于接受客户端套接字的长度int new_fd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(-1 == new_fd){perror("accept error");return -1;}printf("[%s:%d]发来连接,new_fd = %d\n", inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port) ,new_fd);//5、使用新套接字跟客户端进行通信while(1){//从套接字中读取消息char rbuf[3] = ""; //存放接受消息的容器//int res = read(new_fd, rbuf, sizeof(rbuf)-1);int res = recv(new_fd, rbuf, sizeof(rbuf)-1, 0);if(res == 0){printf("客户端已下线\n");close(new_fd);break;}if(res == -1){perror("read error");close(new_fd);close(sfd);return -1;}//如果程序执行至此,表示数据成功读取下来,病放入rbuf中printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);//给当前消息加个笑脸还回去
/* strcat(rbuf, "*_*");//向套接字中写入消息//write(new_fd, rbuf, strlen(rbuf));send(new_fd, rbuf, strlen(rbuf), 0);printf("发送成功\n");
*/}//6、关闭监听套接字close(sfd);return 0;
}
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h> //套接字的头文件
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<string.h>
#define SER_PORT 8888 //服务器端口号
#define SER_IP "192.168.144.128" //服务器ip地址
#define CLIENT_PORT 9999 //客户端端口号
#define CLIENT_IP "192.168.144.128" //客户端ip地址int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == cfd){perror("socket error");return -1;}printf("socket success cfd = %d\n", cfd);//2、绑定IP地址和端口号(可选)//3、连接服务器//3.1 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //通信域sin.sin_port = htons(SER_PORT); //服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //服务器ip地址//3.3 连接服务器if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接成功\n");//4、数据收发while(1){char wbuf[128] = ""; //用于发送数据的容器fgets(wbuf, sizeof(wbuf), stdin); //从终端获取消息wbuf[strlen(wbuf)-1] = '\0'; //将换行改成'\0'if(strcmp(wbuf, "quit") == 0){break;}//将数据发送给服务器//write(cfd, wbuf, strlen(wbuf));send(cfd, wbuf, strlen(wbuf), 0);printf("发送成功\n");//接收服务器发送的消息//read(cfd, wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到的消息为:%s\n", wbuf);}//5关闭套接字close(cfd);return 0;
UDP
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <25061head.h>
#define SER_IP "192.168.144.128"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//服务器端//socket创建套接字 int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){ERR_MSG("socket error");return -1;}//bindstruct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("bind error");return -1;}//收发char buf[128]="";struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);printf("bind success\n");while(1){bzero(buf,sizeof(buf));if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)==-1){ERR_MSG("recv error");return -1;}if(strcmp(buf,"quit")==0){printf("退出程序\n");break;}printf("[%s:%d]发来消息:%s\n",inet_ntoa(cin.sin_addr),htons(cin.sin_port),buf);strcat(buf,"*--*");sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,addrlen);}close(sfd);return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <25061head.h>
#define SER_IP "192.168.144.128"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//客户端//创建socket套接字int cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){ERR_MSG("socket error");return -1;}//bind(可不写)//收发char buf[128]="";struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);printf("hello\n");while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin));if(strcmp(buf,"quit")==0){printf("断开连接\n");return -1;}recv(cfd,buf,sizeof(buf),0);printf("收到消息:%s\n",buf);}close(cfd);//关闭套接字return 0;
}