C语言网络编程

示例: 

struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(1234);
saddr.sin_addr.s_addr=inet_addr("192.168.28.77");
int a=bind((socket描述符),(struct sockaddr *)&saddr,sizeof(saddr));
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
int main(){
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)perror("socket error");
    printf("%d\n",sockfd);

    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(1230);
    saddr.sin_addr.s_addr=inet_addr("192.168.28.47");
    int a=bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
    if(a!=0)perror("bind error");
    
    a=listen(sockfd,5);
    if(a!=0)perror("listen error");
    int accfd=accept(sockfd,NULL,NULL);
    printf("%d\n",accfd);
    char buf[25];
    while(1){
        int rev=recv(accfd,&buf,sizeof(buf),0);
        if(rev<0)perror("receive error");
        else if(rev>0){
            printf("rev: %s\n",buf);
            send(accfd,&buf,strlen(buf),0);
        }
        else if(rev==0)break;
        
        
    }
    close(accfd);
    close(sockfd);
    return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
int main(){
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)perror("socket error");
    printf("%d\n",sockfd);

    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(1230);
    saddr.sin_addr.s_addr=inet_addr("192.168.28.47");
    int a=connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
    if(a!=0)perror("bind error");
    sleep(1);
    send(sockfd,"aaa",3,0);
    char buf[25];
    while(1){
        int rev=recv(sockfd,&buf,sizeof(buf),0);
        if(rev<0)perror("receive error");
        else if(rev>0){
            buf[2]++;
            printf("rev: %s\n",buf);
            send(sockfd,&buf,strlen(buf),0);
            sleep(1);
        }
        else if(rev==0)break;
        
        
    }
    close(sockfd);
    return 0;
}

TCP-server

//TCP server:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<pthread.h>
char buf[128];
struct sockaddr_in rever;
socklen_t len=sizeof(rever);
char list[30];
char note[30][150];
void *mythread(void * arg){
    int acceptfd=*(int *)arg;
    char *ipaddress=inet_ntoa(rever.sin_addr);
    uint16_t port=ntohs(rever.sin_port);
    //char buf[128]={};
    
    while(1){
        int rev=recv(acceptfd,&buf,sizeof(buf),0);
        if(rev<0)perror("receive error");
        else if(rev>0&&buf!="quit\n"){
            time_t timep;
            time(&timep);
            char *times=ctime(&timep);
            times[strlen(times)-1]=0;
            //printf("                %s\n%d(%s %hu): %s\n",times,acceptfd,ipaddress,port,buf);
            
            //send(accfd,&buf,strlen(buf),0);
            //bzero(buf,sizeof(buf));
            for(int i=29;i>=0;i--){
                printf("%s",note[i]);
                strcpy(note[i+1],note[i]);
            }
            printf("                %s\n%d(%s %hu): %s\n",times,acceptfd,ipaddress,port,buf);
            sprintf(note[0],"                %s\n%d(%s %hu): %s\n",times,acceptfd,ipaddress,port,buf);
        }else{
            for(int i=29;i>=0;i--){
                printf("%s",note[i]);
                strcpy(note[i+1],note[i]);
            }
            sprintf(note[0],"the client ranked %d quitted\n",acceptfd); 
            printf("the client ranked %d quitted\n",acceptfd); 
            close(acceptfd);  
            list[acceptfd]=0;
            pthread_exit(NULL);
        }
    }
}
void *sent(void * arg){
    int sendfd;
    char cin[128];
    printf("sender is ok\n");
    while(1){
        scanf("%d>%[^\n]",&sendfd,cin);
        getchar();
        if(cin[0]=='@'&&strlen(cin)==1)strcpy(cin,buf);
        if(cin=="quit")break;
        if(sendfd>0)send(sendfd,cin,sizeof(cin),0);
        else{
            for(int i=0;i<30;i++){
                if(list[i]==1)send(i,cin,sizeof(cin),0);
            }
        }
        for(int i=29;i>=0;i--){
            printf("%s",note[i]);
            strcpy(note[i+1],note[i]);
        }
        time_t timep;
        time(&timep);
        char *times=ctime(&timep);
        sprintf(note[0],"               %s\n                                       %s <--me\n",times,cin); 
        printf("%s",note[0]);
    }
    pthread_exit(NULL);
}
int main(){
    memset(list,0,sizeof(list));
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)perror("socket error");
    printf("%d\n",sockfd);

    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(1234);
    saddr.sin_addr.s_addr=inet_addr("0.0.0.0");
    int a=bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
    if(a!=0)perror("bind error");
    
    a=listen(sockfd,5);
    if(a!=0)perror("listen error");
    
    pthread_t pidt;
    pthread_create(&pidt,NULL,sent,NULL);
    while(1){
        int accfd=accept(sockfd,(struct sockaddr *)&rever,&len);
        list[accfd]=1;
        printf("%d %s\n",accfd,inet_ntoa(rever.sin_addr));
        pthread_t pid;
        pthread_create(&pid,NULL,mythread,&accfd);
        pthread_detach(pid);
    }
    pthread_join(pidt,NULL);
    close(sockfd);
    return 0;
}

TCP--client

//TCP client:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
void *mythread(void * arg){
    int acceptfd=*(int *)arg;
    char buf[128]={};
    
    while(1){
        int rev=recv(acceptfd,&buf,sizeof(buf),0);
        if(rev<0)perror("receive error");
        else if(rev>0&&buf!="quit\n"){
            time_t timep;
            time(&timep);
            char *times=ctime(&timep);
            times[strlen(times)-1]=0;
            printf("            %s\nreceved:%s\n",times,buf);
            //send(accfd,&buf,strlen(buf),0);
            bzero(buf,sizeof(buf));
        }else{
            printf("client quitted\n"); 
            close(acceptfd);  
            pthread_exit(NULL);
        }
    }
}
int main(int argc,const char *argv[]){
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)perror("socket error");
    printf("%d\n",sockfd);

    struct sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(1234);
    saddr.sin_addr.s_addr=inet_addr(argv[1]);
    int a=connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
    if(a!=0)perror("bind error");
    sleep(1);
    send(sockfd,"connected",9,0);
    pthread_t pidt;
    pthread_create(&pidt,NULL,mythread,&sockfd);
    pthread_detach(pidt);
    char in[128];
    while(1){
        fgets(in,127,stdin);
        send(sockfd,in,sizeof(in),0);
    }
    close(sockfd);
    return 0;
}

更多详细内容,查看我的语雀文档C语言网络 (yuque.com) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值