tcp
server
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
int sockfd;
void fa(int signo){
printf("服务器即将关闭\n");
close(sockfd);
exit(0);
}
int main(){
printf("输入ctrl+C退出服务器\n");
signal(SIGINT,fa);
sockfd = socket(AF_INET,SOCK_STREAM,0);//1
if(sockfd == -1) perror("socket"),exit(-1);
struct sockaddr_in addr;//2
addr.sin_family = PF_INET;//与AF一样
addr.sin_port = htons(2222);
addr.sin_addr.s_addr = inet_addr("192.168.182.9");
int res = bind(sockfd,(struct sockaddr*)&addr,
sizeof(addr));//3
if(res == -1) perror("bind"),exit(-1);
printf("bind ok\n");
listen(sockfd,100);//4 同时要求连接的客户端最多100
while(1){
struct sockaddr_in from;//5
socklen_t len = sizeof(from);
int fd=accept(sockfd,(struct sockaddr*)&from,
&len);
if(fd == -1) perror("accept"),exit(-1);
char* fromip = inet_ntoa(from.sin_addr);//转点分十进制的IP格式
printf("%s连接了上来\n",fromip);
char buf[100] = {};
int num = read(fd,buf,sizeof(buf));
printf("读到了%d字节,内容:%s\n",num,buf);
write(fd,"welcome",7);
close(fd);
}
//close(sockfd);//永远执行不到
}
client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(){
int sockfd = socket(AF_INET,SOCK_STREAM,0);//1
if(sockfd == -1) perror("socket"),exit(-1);
struct sockaddr_in addr;//2
addr.sin_family = AF_INET;//与socket()保持一致
addr.sin_port = htons(2222);//include arpa/inet.h
addr.sin_addr.s_addr = inet_addr("192.168.182.9");
int res = connect(sockfd,(struct sockaddr*)&addr,
sizeof(addr));
if(res == -1) perror("connect"),exit(-1);
printf("connect ok\n");//练习:写客户端代码
char buf[100] = {};//读键盘输入并发送服务器
char buf2[100] = {};//从服务器读回来的数据
while(1){
printf("请输入要发送的信息:\n");
scanf("%s",buf);//有'\0',不需要清0
//printf("%s\n",buf);
write(sockfd,buf,strlen(buf));
if(!strcmp(buf,"bye")) break;
int len = read(sockfd,buf2,sizeof(buf2));
printf("回发了%d字节,内容:%s\n",len,buf2);
memset(buf2,0,strlen(buf2));
}
close(sockfd);
}
udp
server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <time.h>
int sockfd;
void fa(int signo){
printf("时间服务器即将关闭\n");
close(sockfd);
exit(0);
}
int main(){
printf("请输入ctrl+C退出\n");
signal(SIGINT,fa);
sockfd = socket(AF_INET,SOCK_DGRAM,0);//1
if(sockfd == -1) perror("socket"),exit(-1);
struct sockaddr_in addr;//2
addr.sin_family = AF_INET;//与socket()保持一致
addr.sin_port = htons(2222);//include arpa/inet.h
addr.sin_addr.s_addr = inet_addr("192.168.182.9");
int res = bind(sockfd,(struct sockaddr*)&addr,
sizeof(addr));
if(res == -1) perror("bind"),exit(-1);
printf("bind ok\n");//练习:写客户端代码
char buf[100] = {};//开两个终端调通
struct sockaddr_in from;
socklen_t le = sizeof(from);
while(1){
int len = recvfrom(sockfd,buf,sizeof(buf),0,
(struct sockaddr*)&from,&le);
time_t cur_time = time(0);
struct tm* cur = localtime(&cur_time);
sprintf(buf,"%4d-%02d-%02d %02d:%02d:%02d",
cur->tm_year+1900,cur->tm_mon+1,cur->tm_mday,
cur->tm_hour,cur->tm_min,cur->tm_sec);
sendto(sockfd,buf,strlen(buf),0,
(struct sockaddr*)&from,le);
}
}
client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(){
int sockfd = socket(AF_INET,SOCK_DGRAM,0);//1
if(sockfd == -1) perror("socket"),exit(-1);
struct sockaddr_in addr;//2
addr.sin_family = AF_INET;//与socket()保持一致
addr.sin_port = htons(2222);//include arpa/inet.h
addr.sin_addr.s_addr = inet_addr("192.168.182.9");
//不连接也能写才是UDP
//write(sockfd,"hello",5);//无连接write()不行
int res = sendto(sockfd,"hello",5,0,
(struct sockaddr*)&addr,sizeof(addr));
//第五个参数是接收方的通信地址,后面是地址长度
if(res == -1) perror("sendto"),exit(-1);
char buf[100] = {};
res = read(sockfd,buf,sizeof(buf));
if(res == -1) perror("read"),exit(-1);
printf("%s\n",buf);
close(sockfd);
}