最近工作日一直在忙工作,都是些YUV图像格式处理的问题,因为还没弄得很明白啊,所以没法往博客上面写
昨天一天休息日又看了一天电影(罪恶啊),今天花了一中午看了点网络IPC的问题,上来写点。只当加深记忆,要是不慎被高手看到,请高手手下留情
以前一直在看APUE,可是我觉得他写的网络IPC这一章既不基础,也不高深,干脆换了本简单的,随便找了本,叫做《unix网络编程实用技术与实例分析》,我不是要说这本书有多好(其实本人并不喜欢这本书的风格),只是交代一下本人的学习背景,以备将来有据可查
本人以前一直没想清楚TCP/IP和我有什么关系,今天看了一上午,终于知道点了,原来我调用的socket就是在TCP,UDP等协议的基础上编写而成的,我调用socket编程,它本身就帮我遵守了这些协议,呵呵,好东西
其它的就好懂了
其实我觉得socket编程入门很容易,无非就是背书嘛,(哈哈,吹牛啦)
把代码拉进来,不知道大家能否看懂,我是差不多可以背了,哈哈
服务器端程序
// File: tcpserver.c
#include <stdio.h>                    
#include <strings.h>                 /* for bzero() */
#include <unistd.h>                  /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>

#define PORT 1234    //将会被打开的端口
#define BACKLOG 1     //最大连接数

int  main()
{
  int listenfd, connectfd; //socket描述符
  struct sockaddr_in server; //服务器地址信息
  struct sockaddr_in client; //客户地址信息
  int sin_size;

//创建套接字
   if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror( "Creating socket failed.");
     exit(1);
  }

  //允许此地址重复绑定套接字
  int opt = SO_REUSEADDR;
  setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//绑定
  bzero(&server,sizeof(server));     //可以用memset函数代替的
  server.sin_family=AF_INET;
  server.sin_port=htons(PORT);
  server.sin_addr.s_addr = htonl (INADDR_ANY);//主机地址
   if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
  {
    perror( "Bind error.");
     exit(1);
  }        
//监听
   if(listen(listenfd,BACKLOG) == -1)/* calls listen() */
  {    
    perror( "listen() error\n");
     exit(1);
  }
//接受---没有接收到就给我阻塞
  sin_size=sizeof(struct sockaddr_in);
   if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)  
  {
    perror( "accept() error\n");
     exit(1);
  }
//发送
  printf( "You got a connection from %s\n",inet_ntoa(client.sin_addr) ); 
  send(connectfd, "Welcome to my server.\n",22,0); /* send to the client welcome message */
//close
  close(connectfd); /*    close connectfd */
  close(listenfd);     /* close listenfd */                
}
客户端程序:
// File: tcpclient.c
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h>                // for struct hostent    

#define PORT 1234     //在别的远程机上打开的端口
#define MAXDATASIZE 100     //数据的最大字节数

int main(int argc, char *argv[])
{
  int fd, numbytes;     //文件描述符
  char buf[MAXDATASIZE];    //存放接受数据的缓冲
  struct hostent *he;                
  struct sockaddr_in server;    //server的地址信息

   if (argc !=2)
  {            
    printf( "Usage: %s <IP Address>\n",argv[0]);
     exit(1);
  }
//根据名字获取机器相关信息
   if ((he=gethostbyname(argv[1]))== NULL)
  {
    printf( "gethostbyname() error\n");
     exit(1);
  }
//socket
   if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1)
  {    
    printf( "socket() error\n");
     exit(1);
  }
//connect
  bzero(&server,sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);
  inet_aton(he->h_addr, &server.sin_addr);
   if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
  {
    printf( "connect() error\n");
     exit(1);
  }
//recv
   if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1)
  {
    printf( "recv() error\n");
     exit(1);
  }

  buf[numbytes]= '\0';
  printf( "Server Message: %s\n",buf);
//close
  close(fd);    
}
执行:
./tcpserver &
./tcpclient
结果:
You got a connection from 127.0.0.1
(这个当然是tcpserver打印的啦,只不过在后台运行的程序突然蹦到前台罢了)
Server Message: Welcome to my server.
可以用ps -ef来查看当前运行的进程,看看在后台跑的程序是否还在跑
如果想杀死进程,则用 kill [pid] 就可以了