- 论坛徽章:
- 0
|
情景:客户端通过socket向服务器发送 开始标志0x02+命令+数据 +结束标志0x03
例如:2NEW|20130716001|M3
主要问题是:客户端发送的数据长度是未知的,我现在的程序一次能接收的数据长度是定义好的,比如512,1024。我想做到结束不定长度的数据,检测到结束标志0x03的时候才结束。
我现在的程序是阻塞的。请高手帮我看下,下面是我现在的程序,需要怎么修改才可以实现我说的功能,给个思路也可以。
main.c- #include <stdio.h>
- #include <pthread.h>
- #include "socket.h"
- int main(int argc, char *argv[])
- {
- pthread_t t;
- pthread_create(&t,NULL,mysocket,NULL); //socket
-
- while(1)
- {}
- return 0;
- }
复制代码 socket.c- #include "socket.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/socket.h> /* socket definitions */
- #include <sys/types.h> /* socket types */
- #include <arpa/inet.h> /* inet (3) funtions */
- #include <unistd.h> /* misc. UNIX functions */
- /*******************************************************
- * 函数名称:mysocket
- * 参数列表:void* args
- * 返回值: NULL
- * 函数功能:socket线程函数
- *******************************************************/
- void* mysocket(void* args)
- {
- unsigned char buf[MAX_LINE];
- unsigned char addr_p[INET_ADDRSTRLEN];
- unsigned int n,i,ret;
- int list_s; /* listening socket */
- int conn_s; /* connection socket */
- socklen_t len;
- short int port; /* port number */
- struct sockaddr_in servaddr; /* socket address structure */
- struct sockaddr_in clenaddr; /* socket address structure */
- /*清空结构体*/
- memset(&servaddr,0,sizeof(servaddr));
- /* Set all bytes in socket address structure to
- zero, and fill in the relevant data members */
- memset(&servaddr, 0, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(MYPORT);
- /* Create the listening socket */
- if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
- perror("create socket error:");
- }
- /*允许地址立即重用*/
- unsigned int bReuseaddr = 0x01;
- setsockopt(list_s,SOL_SOCKET,SO_REUSEADDR,(void *)&bReuseaddr,sizeof(bReuseaddr));
- /* Bind our socket addresss to the
- listening socket, and call listen() */
- if( bind(list_s, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
- perror("bind socket error:");
- }
- if ( listen(list_s, 10) < 0 ) {
- perror("listen socket error:");
- }
- printf("waiting ...\n");
- while(1)
- {
- len = sizeof(struct sockaddr_in);
- /* Wait for a connection, then accept() it */
- conn_s = accept(list_s, (struct sockaddr *) &clenaddr, &len);
- if(conn_s < 0) {
- perror("accept socket error:");
- }
- memset( buf, '\0', MAX_LINE );
- n = read(conn_s, buf, MAX_LINE);
- inet_ntop(AF_INET, &clenaddr.sin_addr, addr_p, sizeof(addr_p));
- printf("client IP is %s, port is %d\n", addr_p, ntohs(servaddr.sin_port));
- printf("read n = %d \n",n);
- if(n == 0){
- printf("no message! \n");
- close(conn_s);
- break;
- }
- printf("%s\n",buf);
- close(conn_s);
- }
- if(close(list_s) == -1){
- perror("fail to close");
- exit(1);
- }
- return NULL;
- }
复制代码 socket.h- #ifndef _SOCKET_H
- #define _SOCKET_H
- #define MAX_LINE 8
- #define MYPORT 8000
- void* mysocket(void* args);
- #endif
复制代码 一次接受的最大数据设为8 是为了测试方便。
客户端:
client.c- #include <stdio.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <string.h>
- #include <stdlib.h>
- #define DEST_IP "127.0.0.1"
- #define DEST_PORT 8000
- int main(int argc, char *argv[])
- {
- struct sockaddr_in sin;
- int sfd,n,i;
- char *str = "1234567890";
- bzero( &sin, sizeof( sin ) );
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = inet_addr( DEST_IP );
- sin.sin_port = htons( DEST_PORT );
- sfd = socket( AF_INET, SOCK_STREAM, 0 );
- connect( sfd, (struct sockaddr *)&sin, sizeof(sin));
- write( sfd, str, strlen( str ) );
- close(sfd);
- return 0;
- }
复制代码 客户端发送这样的数据,服务器只能接收到“12345678”。 |
|