基于TCP的socket编程步骤

原文网址:http://hi.baidu.com/miracletan2008/blog/item/34a921a96dec7abdca130c6e.html

很有条理的介绍socket步骤的文章!

2010年06月02日 星期三 10:27
基于TCP的socket编程步骤:

A 服务器端:
1、 创建套接字;
使用socket()
#include<sys/types.h>
#include<sys/socket.h>

int socket(int domain,int type,int protocol)
建立服务器端的socket套接字

2、 绑定套接字到一个IP地址和一个端口上;
使用bind()
#include<sys/types.h>
#include<sys/socket.h>

int bind(int sockfd,struct sockaddr * myaddr,int addrlen);

3、 将套接字设置为监听模式,以等待连接请求;
使用listen()
#include<sys/socket,h>

int listen(int sockfd,int backlog)

4、 请求到来后,接受连接请求,并返回一个与此次连接对应的套接字;
使用accept()
#include<sys/socket.h>

int accept(int sockfd,struct sockaddr * addr,int * addrlen)
此时新建连接,并创建新的Socket套接字,此时addr为客户端的addr信息。

5、 用返回的套接字和客户端进行通信;
使用recv()和send()
int read(int fd,char * buf,int len)
int write(int fd,char * buf,int len)

6、 关闭当前的连接,进入等待状态,继续等待客户端的连接;
使用close()
#include<unistd.h>
int close(int sockfd);

7、 关闭服务器端的套接字描述符;
使用close()
#include<unistd.h>
int close(int sockfd);

B客户端:
1、 创建客户端套接字;
使用socket()
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol)

2、 向服务器发出连接请求;
使用connect()
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr * servaddr,int addrlen)
其中参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号
3、 和服务器端进行网络通信;
使用recv()和send()
int read(int fd,char * buf,int len)
int write(int fd,char * buf,int len)
4、 关闭套接字;
使用close()
#include<unistd.h>
int close(int sockfd);

简单的实现代码如下:

C服务器端程序:

//服务器端代码..........

#include<sys/socket.h>
#include<stdio.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
                                                                                           
#define MYPORT 8000
#define BACKLOG 10
int main(void)
{
         int sockfd,con_fd,numbytes,ret,pid;
         struct sockaddr_in my_addr;
         struct sockaddr_in their_addr;
         int sin_size;
         int lis;
         char buf[256];
                                                                                           
socketing:
         //creat socket.

         sockfd=socket(AF_INET,SOCK_STREAM,0);
         if (sockfd==-1)
         {
                 printf("failed when creating\n");
                 exit(-1);
         }
         //binding socket.

         my_addr.sin_family=AF_INET;
         my_addr.sin_port=htons(MYPORT);
         my_addr.sin_addr.s_addr=INADDR_ANY;
         bzero(&(my_addr.sin_zero),8);
         ret=bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));
                                                                                           
         if (ret==-1)
         {
                 printf("failed when binding\n");
                 exit(-1);
         }
         //listen.

         if (listen(sockfd,BACKLOG)==-1)
         {
                 printf("failed when listening\n");
                 exit(-1);
         }
         printf("server listening...wait for connect...\n");
         while (1)
         {
                 sin_size=sizeof(struct sockaddr);
                 con_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);
                 if (con_fd<0)
                 {
                         printf("failed when accepting\n");
                         exit(-1);
                 }
                 //recv a string from client and print the string.

                 if (recv(con_fd,buf,sizeof(buf),0)==-1)
                 {
                         printf("failed when receiving the string\n");
                         exit(-1);
                 }
                 printf(" received form client...%s\n",buf);
                 //send the buf string to client and print it.

                 if (send(con_fd,&buf,sizeof(buf),0)==-1)
                 {
                         printf("failed when sending the string");
                         exit(-1);
                 }
                 printf(" send to client...%s\n",buf);
                 close(con_fd);
         }
                 close(sockfd);
                 exit(0);
}




D客户端程序:

//客户端程序:


#include<sys/socket.h>
#include<stdio.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
                                                                                      
#define MYPORT 8000
                                                                                      
//local host

//char * host_name="127.0.0.1";

                                                                                      
int main(int argc,char *argv[])
{
         int sockfd,con_fd,numbytes,ret,pid;
         struct sockaddr_in server_addr;
         struct hostent *their_addr;
         int sin_size;
         int lis;
         char buf[256];
         char *str="Default test string.\n";
         char *ip="192.192.192.190\n";
         //if you input the new host ip after the command

         //then change the default local host ip address.

         if (argc<2)
                 printf("default local host : 192.192.192.190 , or you can input one after the command.\n");
         else
         {
                 ip=argv[1];
                 printf("local host ip = %s\n",ip);
         }
                                                                                      
socketing:
         //creat socket.

         server_addr.sin_family=AF_INET;
         server_addr.sin_port=htons(MYPORT);
         server_addr.sin_addr.s_addr=inet_addr(ip); //inet_addr(ip);

         bzero(&(server_addr.sin_zero),8);
         sockfd=socket(AF_INET,SOCK_STREAM,0);
         if (sockfd==-10)
         {
                 printf("failed when creating\n");
                 exit(-1);
         }
                                                                                      
         //connect the server.

         if (connect(sockfd,(void*)&server_addr,sizeof(server_addr))==-1)
         {
                 printf("failed when connecting\n");
                 exit(-1);
         }
                                                                                      
         //send the default string to server.

         printf(" send to server...%s\n",str);
         if (send(sockfd,str,strlen(str),0)==-1)
         {
                 printf("failed when sending\n");
                 exit(-1);
         }
         //receive a string from server.

         if (recv(sockfd,buf,sizeof(buf),0)==-1)
         {
                 printf("failed when receiving\n");
                 exit(-1);
         }
                                                                                      
         printf(" response from server...%s\n",buf);
         close(sockfd);
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值