void bzero(void *s, size_t n); 功能:把内存块s的n个字节,赋值为0。
时间: 2024-04-13 14:29:34 浏览: 91
`bzero` 函数是一个早期的函数,用于将一块内存中的指定字节数设置为零。它的声明如下:
```c
void bzero(void *s, size_t n);
```
`bzero` 函数接受两个参数:指向要清零的内存块的指针 `s`,以及要清零的字节数 `n`。该函数将 `s` 指向的内存块的前 `n` 个字节都设置为零。
这个函数在现代的 C 标准中已经被标记为废弃,不再建议使用。相反,推荐使用更安全和可移植的函数 `memset` 来进行内存清零操作。`memset` 函数的声明如下:
```c
void *memset(void *s, int c, size_t n);
```
`memset` 函数接受三个参数:指向要设置的内存块的指针 `s`,要设置的值 `c`,以及要设置的字节数 `n`。该函数将 `s` 指向的内存块的前 `n` 个字节都设置为值 `c`。
使用 `memset` 函数进行内存清零操作的示例代码如下:
```c
#include <string.h>
int main() {
char str[10];
memset(str, 0, sizeof(str));
return 0;
}
```
在上面的示例中,使用 `memset` 函数将字符数组 `str` 的所有元素都设置为零。这样可以更安全地清零内存块,并且具有更好的可移植性。
相关问题
#include <sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<string.h> #include<netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> #define PORT 6000; #define SERVER_IP "192.168.40.128" void *routine(void * arg) { int newsockfd=(int *)&arg; char buf[10]; while(1) { bzero(buf,10); int size=recv(newsockfd,buf,sizeof(buf),0); buf[size]='\0'; printf("recive from client is : %s",buf); } } int main() { char buf[10]="hello"; int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { perror("socket fail\n"); return -1; } //Set Sockopt int sinsize = 1; int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sinsize, sizeof(int)); if(ret != 0) { perror("Set sockopt fail!\n"); exit -1; } struct sockaddr_in s; memset(&s,0,sizeof(s)); s.sin_family=AF_INET; s.sin_port=htons(6000); s.sin_addr.s_addr=inet_addr("192.168.40.128");// 要 求 大 端模式的端口号和 IP 地址 int bi=bind(sockfd,(struct sockaddr *)&s,sizeof(struct sockaddr)); if(bi<0) { perror("bind fail\n"); } listen(sockfd,5); struct sockaddr_in c; int size=sizeof(struct sockaddr); int newsockfd=accept(sockfd,(struct sockaddr *)&c,&size); /********************************** 创 建 线 程 ********************************************/ pthread_t pid; pthread_create(&pid,NULL,routine,(void *)socket); while(1) { memset(buf,0,10); fgets(buf,10,stdin); int slen=send(newsockfd,buf,strlen(buf),0); if(slen<0) { printf("send failed\n"); return -1; } } pthread_join(pid,NULL); close(newsockfd); close(sockfd); return 0; }
这段代码存在一些错误。首先,在 `#define PORT 6000;` 中应该去掉分号,否则会导致端口号变成 6001。其次,在 `exit -1;` 中应该使用括号,即 `exit(-1);`。最后,在创建线程时,应该将 `socket` 改成 `newsockfd`,即 `pthread_create(&pid,NULL,routine,(void *)newsockfd);`。修改后的代码如下:
```c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define PORT 6000
#define SERVER_IP "192.168.40.128"
void *routine(void *arg)
{
int newsockfd = *(int *)arg;
char buf[10];
while(1)
{
bzero(buf, 10);
int size = recv(newsockfd, buf, sizeof(buf), 0);
buf[size] = '\0';
printf("recive from client is : %s", buf);
}
}
int main()
{
char buf[10] = "hello";
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket fail\n");
return -1;
}
// Set Sockopt
int sinsize = 1;
int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sinsize, sizeof(int));
if(ret != 0)
{
perror("Set sockopt fail!\n");
exit(-1);
}
struct sockaddr_in s;
memset(&s, 0, sizeof(s));
s.sin_family = AF_INET;
s.sin_port = htons(PORT);
s.sin_addr.s_addr = inet_addr(SERVER_IP);
int bi = bind(sockfd, (struct sockaddr *)&s, sizeof(struct sockaddr));
if(bi < 0)
{
perror("bind fail\n");
return -1;
}
listen(sockfd, 5);
struct sockaddr_in c;
int size = sizeof(struct sockaddr);
int newsockfd = accept(sockfd, (struct sockaddr *)&c, &size);
/********************************** 创建线程 ********************************************/
pthread_t pid;
pthread_create(&pid, NULL, routine, (void *)&newsockfd);
while(1)
{
memset(buf, 0, 10);
fgets(buf, 10, stdin);
int slen = send(newsockfd, buf, strlen(buf), 0);
if(slen < 0)
{
printf("send failed\n");
return -1;
}
}
pthread_join(pid, NULL);
close(newsockfd);
close(sockfd);
return 0;
}
```
#include <sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<string.h> #include<netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> #include <arpa/inet.h> #include <stdbool.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #define PORT 6000 #define SERVER_IP "192.168.40.128" void *routine(void * arg) { int newsockfd=*(int *)arg; char buf[10]; while(1) { bzero(buf,10); int size=recv(newsockfd,buf,sizeof(buf),0); buf[size]='\0'; printf("recive from client is : %s",buf); } } int main() { char buf[10]="hello"; int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { perror("socket fail\n"); return -1; } //Set Sockopt int sinsize = 1; int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sinsize, sizeof(int)); if(ret != 0) { perror("Set sockopt fail!\n"); exit -1; } struct sockaddr_in s; memset(&s,0,sizeof(s)); s.sin_family=AF_INET; s.sin_port=htons(6000); //s.sin_addr.s_addr=inet_addr("192.168.40.128");// 要 求 大 端模式的端口号和 IP 地址 s.sin_addr.s_addr = inet_addr(SERVER_IP); int bi=bind(sockfd,(struct sockaddr *)&s,sizeof(struct sockaddr)); if(bi<0) { perror("bind fail\n"); } listen(sockfd,5); struct sockaddr_in c; int size=sizeof(struct sockaddr); int newsockfd=accept(sockfd,(struct sockaddr *)&c,&size); /********************************** 创 建 线 程 ********************************************/ pthread_t pid; pthread_create(&pid,NULL,routine,(void *)&newsockfd); while(1) { memset(buf,0,10); fgets(buf,10,stdin); int slen=send(newsockfd,buf,strlen(buf),0); if(slen<0) { printf("send failed\n"); return -1; } } pthread_join(pid,NULL); close(newsockfd); close(sockfd); return 0; }编写能够与这个代码相互收发的代码
好的,以下是一个简单的客户端代码,可以与给出的服务端代码相互收发消息:
```c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#define PORT 6000
#define SERVER_IP "192.168.40.128"
int main() {
char buf[10];
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket fail\n");
return -1;
}
// Set Sockopt
int sinsize = 1;
int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sinsize, sizeof(int));
if (ret != 0) {
perror("Set sockopt fail!\n");
exit(-1);
}
struct sockaddr_in s;
memset(&s, 0, sizeof(s));
s.sin_family = AF_INET;
s.sin_port = htons(PORT);
s.sin_addr.s_addr = inet_addr(SERVER_IP);
int conn = connect(sockfd, (struct sockaddr *)&s, sizeof(s));
if (conn < 0) {
perror("connect fail\n");
return -1;
}
while (1) {
memset(buf, 0, 10);
printf("请输入要发送的消息:");
fgets(buf, 10, stdin);
int slen = send(sockfd, buf, strlen(buf), 0);
if (slen < 0) {
printf("send failed\n");
return -1;
}
memset(buf, 0, 10);
int rlen = recv(sockfd, buf, sizeof(buf), 0);
if (rlen < 0) {
printf("recv failed\n");
return -1;
}
printf("接收到来自服务器的消息:%s\n", buf);
}
close(sockfd);
return 0;
}
```
运行客户端代码后,你可以输入要发送的消息,然后按回车键发送到服务器,并等待服务器的回复。注意,这里的代码是一个简单的交互式客户端,没有进行异常处理和错误检查,需要在实际使用中进行优化。
阅读全文