聪明难,糊涂难,由聪明而转入糊涂更难。放一著,退一步,当下心安,非图后来福报也。

socket 之tcp、udp编程

TCP:

server.c
复制代码
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define PORT 1500//端口号
#define BACKLOG 5/*最大监听数*/
int main(){
int sockfd,new_fd;/*socket句柄和建立连接后的句柄*/
struct sockaddr_in my_addr;/*本方地址信息结构体,下面有具体的属性赋值*/
struct sockaddr_in their_addr;/*对方地址信息*/
int sin_size;
sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(sockfd==-1){
printf("socket failed:%d",errno);
return -1;
}
my_addr.sin_family=AF_INET;/*该属性表示接收本机或其他机器传输*/
my_addr.sin_port=htons(PORT);/*端口号*/
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*IP,括号内容表示本机IP*/
bzero(&(my_addr.sin_zero),8);/*将其他属性置0*/
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){//绑定地址结构体和socket
printf("bind error");
return -1;
}
listen(sockfd,BACKLOG);//开启监听 ,第二个参数是最大监听数
while(1){
sin_size=sizeof(struct sockaddr_in);
new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小
if(new_fd==-1){
printf("receive failed");
} else{
printf("receive success");
send(new_fd,"Hello World! yyds",14,0);//发送内容,参数分别是连接句柄,内容,大小,其他信息(设为0即可)
}
}
return 0;
}

client.c
复制代码
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define DEST_PORT 1500//目标地址端口号
#define DEST_IP "127.0.0.1"/*目标地址IP,这里设为本机*/
#define MAX_DATA 100//接收到的数据最大程度
int main(){
int sockfd,new_fd;/*cocket句柄和接受到连接后的句柄 */
struct sockaddr_in dest_addr;/*目标地址信息*/
char buf[MAX_DATA];//储存接收数据
sockfd=socket(AF_INET,SOCK_STREAM,0);/*建立socket*/
if(sockfd==-1){
printf("socket failed:%d",errno);
}
//参数意义见上面服务器端
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(DEST_PORT);
dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr))==-1){//连接方法,传入句柄,目标地址和大小
printf("connect failed:%d",errno);//失败时可以打印errno
} else{
printf("connect success");
recv(sockfd,buf,MAX_DATA,0);//将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。
printf("Received:%s\n",buf);
}
close(sockfd);//关闭socket
return 0;
}
------------

C语言SOCKET编程指南

tcp2:

tcp_echo_client.c
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>
#define SERV_PORT 8080
#define BUF_SIZE 128
int main(int argc, char *argv[]){
if(argc < 2){
fprintf(stderr, "usage: %s <MSG>\n", argv[0]);
exit(EXIT_FAILURE);
}
int sockfd;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("create_sockfd error");
exit(EXIT_FAILURE);
}
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
if(inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0){
perror("convert_servaddr error");
exit(EXIT_FAILURE);
}
servaddr.sin_port = htons(SERV_PORT);
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
perror("connect_sockfd error");
exit(EXIT_FAILURE);
}
char buf[BUF_SIZE];
int nbuf = strlen(argv[1]);
send(sockfd, argv[1], nbuf, 0);
nbuf = recv(sockfd, buf, BUF_SIZE, 0);
buf[nbuf] = 0;
printf("echo msg: %s\n", buf);
close(sockfd);
return 0;
}
tcp_echo_server.c.c
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>
#define LISTEN_PORT 8080
#define BUF_SIZE 128
int main(void){
int listenfd;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("create_listenfd error");
exit(EXIT_FAILURE);
}
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(LISTEN_PORT);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
perror("bind_listenfd error");
exit(EXIT_FAILURE);
}
if(listen(listenfd, SOMAXCONN) < 0){
perror("listen_listenfd error");
exit(EXIT_FAILURE);
}
int connfd;
struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
char buf[BUF_SIZE];
int nbuf;
for(;;){
if((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &peerlen)) < 0){
perror("accept_listenfd error");
continue;
}
nbuf = recv(connfd, buf, BUF_SIZE, 0);
buf[nbuf] = 0;
if(!strcmp(buf, "exit")){
printf("exit_server\n");
close(connfd);
break;
}
printf("new conn(%s:%d); msg: %s\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port), buf);
send(connfd, buf, nbuf, 0);
close(connfd);
}
close(listenfd);
return 0;
}
run.sh
复制代码
#!/bin/bash
# **********************************************************
# * Copyright (C) 2022 DCS. All rights reserved.
#
# * Author : si.cao
# * Email : **********@outlook.com
# * Create time : 2022-01-13 11:03
# * Last modified : 2022-01-13 11:03
# * Filename : run.sh
# * Description :
# **********************************************************
for ((i=0; i<10; i++));
do ./test 'www.zfl9.com';
done && ./test 'exit'

c语言 - socket编程(一)


c语言 - socket编程(二)


c语言 - socket编程(三)


c语言 - socket编程(四)


posted @   上官鸿信の  阅读(61)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示