socket 通信

来源:互联网 发布:行为经济学 人工智能 编辑:程序博客网 时间:2024/05/12 17:03

现在使用TCP/IP协议的应用程序通常都是采用UNIX  BSD的套接字(socket)来实现网络进程之间的通信的,socket通过它的几个函数来实现网络中进程间的通信。

这几个函数分别是:

   socket()函数

   bind()函数

   listen()、connect()函数

   accept()函数

   read()、write()函数

   close()函数

废话不多说,下面给两端简单的代码就清楚啦

---服务器端---

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>//struct sockaddr_in
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <ctype.h>

#define PORT 8888
#define A(x) (struct sockaddr*)(&x)

void* func(void* p)
{
 int c = (int)p;//套接字
 char buf[1000];
 for(;;){
  int n;
  n=read(c,buf,sizeof(buf)-1);//读取客户端来的信息
  if(n<=0) break;//出错或者对方关闭就退出
  buf[n] = '\0';
  if(strcmp(buf,"bye\n")==0||strcmp(buf,"bye\r\n")==0) break;
  int i;
  write(1, buf, n);//在屏幕上显示
  //转换成大写
  for(i=0; i<n; i++) buf[i]=toupper(buf[i]);
  write(c,buf,n);//发送到客户端
 }
 close(c);
}

int main()
{
 int s;
 s = socket(AF_INET, SOCK_STREAM, 0);//建立套接字
 struct sockaddr_in si;
 si.sin_family = AF_INET;
 si.sin_addr.s_addr = INADDR_ANY;//0,本机的任何ip
 si.sin_port = htons(PORT);
 if(bind(s, A(si), sizeof(si))<0){
  printf("%s\n",strerror(errno));exit(1);
 }
 listen(s, 5);
 for(;;){
  socklen_t len = sizeof(si);
  int c = accept(s,A(si),&len);//等待客户端连接
  if(c<0) continue;
  //成功就返回新套接字
  
  char buf[100], ip[100];
  inet_ntop(si.sin_family,&si.sin_addr,ip,sizeof(ip));
  printf("%sConnection successful\n", ip);
  sprintf(buf,"The request from <%s,%d>\n",
    ip,ntohs(si.sin_port));
  write(c,buf,strlen(buf));
  pthread_t id;
  pthread_create(&id,NULL,func,(void*)c);
  pthread_detach(id);
  //close(c);
 }
}

 

---客服端---

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char* argv[])
{
 if(argc!=2){
  printf("%s serverip\n",argv[0]);
  return 0;
 }
 int s=socket(AF_INET,SOCK_STREAM,0);//建立套接字
 struct sockaddr_in si;
 si.sin_family = AF_INET;
 inet_pton(AF_INET,argv[1],&si.sin_addr);
 si.sin_port = htons(8888);
 if(connect(s,(struct sockaddr*)&si,sizeof(si))<0){
  //连接失败
  perror("connect");
  return 1;
 }
 //连接成功:
 char buf[1000];
 for(;;){
  int n = read(s,buf,sizeof(buf));//从服务器读取
  if(n<=0) if(errno!=EINTR)break;else continue;
  write(1,buf,n);//显示到屏幕止
  write(1,"input:",6);//提示输入
  n=read(0,buf,sizeof(buf));//从键盘读取
  write(s,buf,n);//发送到服务器
 }
 close(s);
}

 

原创粉丝点击