歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 小白初學簡單阻塞式socket編程 linux c編程

小白初學簡單阻塞式socket編程 linux c編程

日期:2017/3/3 11:35:33   编辑:Linux技術

最近第一次學習了socket編程 本地進程間通信和利用局域網來通信都了解了一點 這次主要寫的是通過局域網來通信

首先 服務器端代碼

頭文件:

#include<stdio.h>

#include<stdlib.h>

#inlcude<string.h>//以上三個為標准c語言函數,這裡不多加贅述

#include<unistd.h>//linux c編程時用庫函數要加的頭文件 類比於windows.h 可以使用Unix操作系統庫裡的東西

#inlcude<sys/types.h>//包含編程時需要用到的一些數據類型

#include<sys/socket.h>//socket編程時要用的頭文件

#include<sys/un.h>//Internet 協議族

#include<arpa/inet.h>//包含ip地址由本地字序轉換到網絡字序(大端?)時要用到的函數

定義變量:

int server_fd,client_fd;//通信用的套接字

struct sockaddr_in myaddr;//socket編程時 若是局域網通信 用到的一種結構體

struct sockaddr_in client_addr;

myaddr.sin_family=AF_INET;//結構體中包含的內容之一 所用的通信協議

myaddr.sin_addr.s_addr=htonl(INADDR_ANY);之二 允許連接的ip INADDR_ANY表示允許任意ip地址連接

myaddr.sin_port=htons(8080);//之三 使用的端口號

int clientlen=sizeof(client_addr);

以下是創建連接的過程

//1.socket

server_fd=socket(AF_INET,SOCK_STREAM,0);

if(server_fd==-1)

{

perror("socket error");

exit(-1);

}

//2.bind

if((bind(server_fd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)

{

perror("bind error");

exit(-1);

}

//3.listen

if(listen(server_fd,5)==-1)

{

perror("listen error");

exit(-1);

}

printf("listening...\n");

//4.accept

client_fd=accept(server_fd,(struct sockaddr *)&client_addr,&clientlen);//創建一個新的套接字 原來那個仍用於監聽端口 這個用於發送接收消息

if(client_fd==-1)

{

perror("accept error");

exit(-1);

}

//5.op

send(client_fd,"hi i'm kid",11,0);

printf("write to client\n");

//6.close

close(server_fd);

close(client_fd);

}

客戶端代碼

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<sys/un.h>

#include<netinet/in.h>

#include<arpa/inet.h>

int main()

{

int server_fd;

struct sockaddr_in myaddr;

myaddr.sin_family=AF_INET;

myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");//將點制ip轉化成32位長整形整數

myaddr.port=htonl(8080);

char buf[100];

server_fd=socket(AF_INET,SOCK_STREAM,0);

if(server_fd==-1)

{

perror("socket error");

exit(-1);

}

if((connect(server_fd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)

{

perror("connect error");

exit(-1);

}

recv(server_fd,buf,100,0);

printf("%s\n",buf);

close(server_fd);

}

Copyright © Linux教程網 All Rights Reserved